読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

SEA Forum in March 2012 - 「実用期を迎えた関数プログラミング」に出かけてきました

関数プログラミング、流行ってるらしいからちょっと行ってみようゼ」というミーハー根性丸出しで行ってきました。
the pillowsのステッカー貼ったThinkPadを広げていたのが僕です。


結論から申し上げましょう。

(僕が行くには)早すぎたんだ……


学校でちょろっと講義を受けただけの「関数型言語を知ってる」というレベルで行ってしまったのは少しもったいない感じがしました。
もっと僕に知識があれば、更に楽しめたのではないかと思います。


ただ、もちろん有益なお話を聞けたのでそれについて徒然なるままに。

気付いた事

俺のThinkPad、'-'キーの効きが悪すぎじゃねぇ!? クソが!!!

さておき

IT Planning社/小笠原氏の「関数プログラミングのエッセンスと考え方」と題されたプレゼンが非常に勉強になりました。
関数プログラミング素人の僕でもある程度理解できたので。
そもそも僕は2つの教育機関で、それぞれ1ヶ月から2ヶ月ほど関数プログラミングを勉強した「はず」なんですが、ほぼ理解の助けにはなりませんでした。
が、今回のプレゼンである程度関数型プログラミングが理解出来たような気がします。
90分で1ヶ月以上の講義の内容を凌駕する小笠原氏のプレゼン、恐るべし!


で、印象に残ったものを以下に。

1) 複雑な処理と適合できる

  手続き型言語のそれと比較してアルゴリズムを簡潔に記述する事が出来るらしいです。
  後述の高階関数を使って関数を組み合わせる事によって簡潔に書けるようです。
  「3行で書ける!」は伊達じゃない。

2) 関数プログラミング(高階関数)を用いる事により、プログラムの再利用性が向上する

  プログラミングアプローチは、「プログラムの再利用性」をなんとかする為に変化を続けてきたと言えるでしょう。


  構造化プログラミング以前 --- 再利用性? なにそれ食えんの?
   ↓
  構造化プログラミング --- 処理はなるたけ関数にしろ! その関数を使えば再利用性高まるだろ!
   ↓
  オブジェクト指向プログラミング --- プログラムの部品はオブジェクトにまとめて、それで構築しろ! そのオブジェクト使えば再利用性上がんだろ!


  という具合に、プログラミング手法は移り変わってきたので、いずれここに
   ↓
  関数プログラミング --- 汎用的な関数を組み合わせる事によって新しい(関数|機能)を組み立てろ! 使うのは汎用的な関数だから、もちろん再利用性高いだろ!

  
  という手法が加わり一般化する……のかもわかりません。


  しかし、この「高階関数」関連の話がサクッと理解できたのは最近必要に迫られてJavascriptをガシガシ書いてたからなんだろうなぁ……
  Javascriptの軽いノリで関数プログラムっぽいものが書けるのは結構好きです。ただfunction(foo){bar;}が至る所に書かれているのが美しいかどうかはさておき。

3) 変数を上書きしないプログラミングスタイル

  この部分が若干イメージが沸かなかったんですが。手続き型プログラミングでは変数の中身をガンガン書き換えるのが常でしたので。
  ただ、
  ・高階関数に渡した関数はいつ呼び出されるか分からないどころか呼び出されない可能性すらある
  ・高階関数が代入によって変わりうる変数の中身を参照している
  となると確かに結果がおかしな事になりそうなので、こういうプログラミングスタイルが必要なんだな、とは思いました。

4) 代数的データ型を使うとぬるぽが消える

  これは嬉しい。

Yesod

Yesodというフレームワークを初めて聞きました。
「ヤッター! Webアプリケイションが出来るよー!」というナイスなフレームワークなようです。
組み合わせ次第では
「ヤッター! サーバーサイドプログラムも作れるよ−!」
「ヤッター! クライアントサイドプログラムも出来るよ−!」
という数ヶ月前の自分に聞かせてあげたいナイスっぷり。


現在はJavaJavascript(dojo)連合でJSPを実現しているので、
このYesodを利用するとどのような恩恵に授かれるのかが気になるところです。
(まあ、その前にHaskellを使えるようにならなければならない訳ですが……)

Scala

(説明を聞いた限り)今から関数プログラミングを勉強するのであればScalaが敷居が低くて良いのでは無いかと思いました。
とりあえず([会社|学校]が)溜め込んだJavaの資産を利用できるのは中々に大きいと思います。
あと軽くサンプルコードを読んだ限りでは、「チャキチャキの関数型言語的記述」というよりも、
「色々と融通の利く書き方が出来る」という印象を受けたので。


もしかしたら、前述のJSPScalaでリプレースできるんじゃ……? と夢が広がりングというアレです。

散々話題になってたデバッグについて

これに関しては憶測の域を出ないんですが、質問者の方が聞きたかったのって
「『これは使える!』っていうデバッグツール、あんの?」
って事だと思うんですがいかがでしょうか。


ただ、「printf()デバッグが使える」というのは大きいですね。

まとめ

関数型言語はなんだか凄そうだぞ、と。
5年前あたりから「関数プログラミングは流行る!」と聞かされていて、
その当時は「ああ、『今年のカープはひと味違うぜ!』と同じタイプのやつか」と思っていたんですが、
今日の話を聞くと本当に関数プログラミングは流行りそうな気がしました。


乗るしかない、このビッグウェーブに!
てな訳で、関数型言語を勉強しないとなぁ……
Haskellはなんだか怖いからScalaかしらん。


しかし、ラビ・セシィ博士の「プログラミング言語の概念と構造」で関数型言語を勉強するのは中々にマゾい……!
学習に使う本も考えた方が良さそうですね。


そんな感じでした。
有意義な公演でした。パネリストの皆様、ありがとうございました!