おはようございます。昨日はえらく勉強した1日でした。
ちょっと雑多ですが、自分の備忘録としてメモしておきます。厳密な解釈ではありませんのであしからず。
>発見その1
関数型プログラミングというのは、”プログラムする=計算する”という行為をきちんと定式化するために、
ラムダ計算
という演算をベースにして考えられたもので、その「副産物」として、
関数と数が等価 = 関数が一等市民である
という便利な性質が生まれた。
これを応用すれば、関数を引数や戻り値として渡すことができるし。構文がすっきりして、独自の制御構造を作ることができる。
>発見その2
関数プログラミングには難点があって、純粋関数型言語では「遅延評価」をベースとしているがために、「副作用」を持つ処理を苦手としている。これを解決しているのが
関数型+命令型
という考え方で、ScalaやRuby、Pythonなどはこの考え方を採用しているけれど、Scalaには”関数リテラル”という関数型プログラミングを強力にバックアップする仕組みが提供されているという点で、関数型言語のHaskellなどに近く、強力な関数型言語かつ命令型のハイブリッド。しかもScalaは、その性質に”完全なオブジェクト指向”ということが強力な機能としてプラスされている。
もうここまでくるとScalaを選ばない理由はないようにさえ思えてくるのは気のせいかな。
>発見その3
前述の”副作用”の回避のために、モナド(Monad)という概念がある。これはとても単純なもので、モナドとは「コンテナ」であると考えることができる。モナドとよばれるそのコンテナは、次の機能を持つ。
[1] ある要素xを与えられたとき、それをコンテナに入れるための(=モナドMxに変換する写像としての)関数Unit(x)が準備されている。→ ユニットコンストラクタ
[2] あるモナドMxが与えられたとき、そのモナドに含まれる要素xを取り出して、”関数fと要素yを引数にとり、y = f(x)を適用し、それをコンテナに含めて返す(モナドMyに変換して返す)”という関数を返す関数Bind(Mx)が準備されている。 → バインド
この2つの操作が準備されているコンテナのようなもの(つまり、そういう関数が定義されている集合)のことを、モナドという。これはオブジェクト指向でいうところのクラスとメソッドとして定義されている。
これを使うことによって、例えばリストからの取り出し・収納、リスト全てに対するフィルタの適用(要するにforeach文)、コンテナの結合=ベルトコンベア式な計算の結合、副作用を排除したI/O操作などができるようになる。
ただし副作用を排除したI/O操作に関しては、Scalaでは命令型の操作が可能なので、どちらを使ってもよい。
>発見その4
圏論という考え方を使うと、数値や集合、型や関数といった考え方の見通しをすっきりとすることができる。特に、従来の手続きを「写像」に置き換え、配列を「集合」に置き換えて、集合X、Yについて写像 f:X→Y を適用するという考え方は(プログラマとして)画期的。
要するに、
論理の美しさ(論理性、安全性)と、その実用性(柔軟性、簡潔性)を併せ持ったScalaは、すばらしい言語だということがよくわかった。
これは間違いなくNext Javaだろうし、.NET Frameworkでも動くという事実から、C++/Javaに代わる新スタンダード言語になるのは時間の問題だと思う。
あとは、インストールの簡単さと、日本語文献・ユーザ数が一定数を越えさえすれば、きっと多分事実上の最強言語になる。
残っている問題は、
・”暗黙の型変換”(Scala) vs ”動的型付け”(Ruby)
・関数型言語の実行速度 vs 動的型付け言語の実行速度
の対決かな。僕はこの問題に関してもScalaに一票で、特に後者に関してはScalaは命令型とのハイブリッドなのでほとんど問題ないらしい。
けど、あとはプログラマの技量と知識力がついてくるかっていう問題があるし、画期的であってもその良さが知られなかったら、HaskellとかPrologeみたいに普及しないかもしれない。
この辺は中村先生もいつも言ってるように、僕みたいなユーザがきちんとその良さを伝えていかなくちゃ。
…それにしても、Ackeyはホントすばらしすす。圏論を解読してくれてありがとう。
きっとこれからのプログラマは、もっと数学とか物理学みたいな「モデル」を勉強しなきゃいけないのかもなぁ。
PR