何故、関数型言語Haskellを学んでいるのか #fpstudy

大阪で開催された「第一回関数型言語勉強会」に発表者として参加してきました。
その準備等の関係で、しばらくダイアリーが付けられていませんでしたが、ちまちま再開していこうと思います。

会場のGoogleマップが別の場所を指していたり、そもそも降車駅を間違えたりとかなんとかで、15分くらい余裕を見て出たつもりが1時間も遅刻して発表順に影響を与えるという体たらくでしたが(その節はご迷惑おかけしましたm(__)m)、楽しく話をできたし色んな話を聞くことができました。

今回の発表資料や、要望のあったプログラムについては下のほうに置いておきます。

本題

さて、懇親会にて、こんな質問を頂いたのですが、恥ずかしながら口ごもってしまいました。
http://d.hatena.ne.jp/moririring/20120520/1337468189
「結局の所、関数型言語は何が良いのですか?何が作れるのですか?」

実は今回の勉強会の意向としては、「関数型言語はどうすれば理解できるか」「どのように考えれば関数型言語を理解できるか」というものだと考えていたので、こんな質問を頂く事は全く想定していなかったのです・・・というのは言い訳ですが。

まずコードが短くなるという話について、Haskellの例を上げると、上手く抽象化すれば、読みやすさを維持したままかなり短く書けます。これは、自分のサイコロ問題の記事でuskzさんに頂いた回答を見れば納得頂けると思います。
http://d.hatena.ne.jp/its_out_of_tune/20120327/1332864475

次に、非関数型言語へ考え方の応用についてです。
確かに、「関数型言語で身につけた考え方が手続き型言語に生かせる」という答えもあるでしょう。
しかしそれは、「関数型言語を学ぶメリット」かもしれませんが、「関数型言語のメリット」では無いわけです。

別に、オブジェクト指向を突き詰めながら、C#やJava8のラムダ式をその延長として身につけて行ったって良いと思います。
グローバル変数は極力避けるようにしよう」「関数(メソッド)はなるべく小さく書くようにしよう」なんていうのは昔からずっと言われ続けている事ですし、高階関数クロージャを使える非関数型言語も沢山あります。

では、何故自分はHaskellを好んで選択し、習得しようとしているのか・・・

上記の質問への答えというワケではありませんが、これを切っ掛けに、ちょっと自分自身のHaskellへの捉え方を整理してみようと思います。

関数型言語」というパラダイムの話では無く、あくまでHaskellの話です。

そもそも楽しいんですよ

色々思い返してみると、高校の時にVisualBasicで作ったヘタレHTMLエディタ(恥ずかしくて公開できた代物じゃないですが)に拡張機能を付けるため、ちょっとしたオレオレ言語のインタプリタを積んだあたりから、興味の対象が「プログラミングを使ったモノづくり」から「プログラミング」そのものにシフトして行ったような気がします。

Haskellについても「楽しくてやっている」面が大きいのは否定できないと思います。だから「現実的に何が良いの?」と言われても、すぐに明瞭な回答ができないのです。

ついついHaskellを「良い言語」と人に紹介してしまいがちですが。次からは「楽しいよ?」という部分を強調できると良いかもしれません(´・ω・`)

実用性は・・・?

正直な所、実用的に見てHaskellってどうなの?と聞かれた時になんとも言えないのは自分自身がHaskellではある程度以上の規模のものを作れていないし、そのためにはまだ勉強が不十分だから、という部分が大きいです。

部分的にでも副作用を認めていれば少しは感で話をできるかもしれませんが、Haskellは純粋関数型言語です。
ある程度以上複雑な事をしようとする時に、モナドモナド変換子で何処までできるか、どのようにしてやるか。遅延評価でどのようにしてどこまで最適化できるのか、という点についてはまだまだ勉強が必要です。

ちなみに、他の関数型言語について思うところは・・・

Scalaは部分的に副作用を認めていますし、JVM上で動作するので既存のリソースを再利用できる分、業務システム上に活躍の場があるかと思われます。
Lispが実用的な言語かどうかは・・・Emacsのヘビーユーザーあたりに聞いてください。そもそもLisp関数型言語に含まれるかどうかは・・・宗教論争に巻き込まないで頂けるとありがたいですm(__)m

可能性の話

では、Haskellを選択する事はモノづくりの手段として適切では無いのかと言えば、決してそんな事は無く、自分としてはHaskellの学習を楽しみつつ、将来的にはこの言語をモノづくりの土台にして行きたいなぁ、なんてわりと本気で思ってたりします。
勿論、これは今の段階での話で、もしかしたら妥協して副作用のある他言語を選択しているかもしれません。

しかし、先に書いたように、Haskellの高い抽象能力は高度なモジュール化の期待ができますし、何より強い型付けがHaskellの魅力だと思っています。
副作用が無く型安全が保証された環境ならば、「何かを作る」(それが何かはひとまず置いといて)際に余計なバグや弊害に頭を抱える事は最小限に抑えられるはず、と考えています。

では実際にどんなものが、どんな風に作れて、だからHaskellは素晴らしいのか・・・?という話は、おいおい、自分が何か作り上げたあと、ゆっくり語れれば良いなぁ、なんて、思います。

第一回関数型言語勉強会 発表資料

というわけで、今回の勉強会に用意した発表資料です。だいぶグダグダですが、全体の向としては、「ラムダ計算を中心に考えていけば関数型言語を理解できる」というものです。
http://www.slideshare.net/_TUNE_/material-12998347

スライド内で紹介してますが、普通に話をするだけではつまらないと思ったので、Javaで色々制約をかけて関数型的にBrainF*ck処理系を書いてみたわけですが、余計話をややこしくしてしまったダケな気も。
なんにせよ、いじってみたいという要望を頂きました(有り難いことです)ので試行錯誤しながらbitbucketに登録しました。
https://bitbucket.org/_TUNE_/------------/src

とても楽しかったです、遠出なのであまり頻繁だと苦しいですが、第二回目も是非参加させて頂ければ幸いです。
関数合成の話をするか、モナドの話をするか、それともネタに走るか・・・どうしようかなぁ・・・