入門Haskellプログラミング

入門Haskellプログラミング

入門Haskellプログラミング

関数型の影響をうけた言語機能の元々の意味を知るには良いと思う。

関数型プログラミングブームのようなものが始まったのは2010年頃からだろうか。Scalaが注目されだしたころからのように思う。そこから最近の言語はほとんどが関数型の書き方を取り入れるようになっており、Javaですらラムダが入ったのはもうずいぶん前のことだ。

自分はというと、2010年代前半にScalaを業務で使う必要が出てきた。元々Javaでシステムを書いていた会社に中途で入ったのだが、前任者がScala好きでそれを引き継ぐことになった。自分はJavaはやったことがあったが、Scalaは全く触ったことがなく、まずはコップ本から始めた。

Scalaを学ぶのはそれなりに面白く、業務でもそれなりには使用できるようになった。しかしもともとBetter Javaとしての使用だったこと、オブジェクト指向言語としても使用できることから、関数型としての深い使い方は行っていなかった。

当時から関数型言語の親玉的な存在でHaskellは認識していたが、自分は実用的なケースがない学習には興味が薄かった。しかし最近あまりに実用本位なプログラミングにも疲れていたので、たまにはこういうのも良いと思って勉強してみた。演習問題も全部やっている。

良かったことは、関数型とのハイブリッド言語において何故あるのかよくわからなかった機能が、元の純粋関数型言語ではどういう意味があったかがわかったことだと思う。

その代表例がカリー化だ。Scalaには機能としてあるし、最近のJSでも関数を返す関数は実質的なカリー化に近い。この本においては部分適用で一部の引数を固定した関数を返すことを「オブジェクト指向」とあえて呼んでいる。

最初は意味がわからなかったが、関数呼び出し時には不可視で固定的な変数と動的なメソッド引数によって、戻り値が決定されるという意味では確かにこれはオブジェクト指向のオブジェクトだ。しかも副作用がない。

これによりクロージャーの変数束縛も理解できてきた。これは本来はちゃんと引数として設定すべきものを、利便性のためにスコープの変数を自由に束縛できるだけなのだろうと。

変数束縛があると関数が実行時の環境によって結果が変わってしまうし、何が入力であるかが関数定義から明確ではない。これでは関数型のメリットは台無しだ。そのためHaskellには他の言語におけるクロージャーの変数束縛というものはない。


Haskellといえば必ず話題になるモナドだが、少なくともHaskellの型としてのModadが何であるかは理解はできたように思う。この本のUNIT5のFunctor, Applicative, Monadを図で示して順番に説明するやりかたはわかりやすかった。

Scalaを使っていたころはOptionの扱いに辟易しており、Kotlinのようにnull安全にしてそのための演算子を作ったほうが使いやすいと思っていた。しかしこのようにコンテキスト自体を抽象化し、そのための専用の演算子を作るのであれば、Optionのようなコンテキスト型もかなり使いやすく書ける気がしてきた。

副作用のある世界との切り分けも興味深いが、ここを正確に理解しているのかと言われると怪しい。実際に演習とは異なることをやらないと本当に理解はできないように思う。


しかしHaskellを使用して実際に業務なり個人開発を行ってみたいとはあまり思わなかった。それなりにメリットもあると思うが、論理の複雑さが結果的にバグを多く産むように思われる。実業務ではかなり優秀な人だけがいる現場でないと成立しないだろう。

とはいえ少なくとも純粋関数型言語怖い病は少しは克服できたように思う。Lisp系のClojureも少し学んでみようかと思っている。