第2期第23回H本読書会を開催しました。
第13章「モナドがいっぱい」の最後の部分と第14章「もうちょっとだけモナド」を読みました。
H本読書会とは?
- 作者: Miran Lipovaca
- 出版社/メーカー: オーム社
- 発売日: 2012/09/21
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る
こちらの本を輪読する読書会です。
Haskellを覚えると色々楽しいことがあるんじゃないかと始めた読書会で、Haskellに関する本を少しずつ読んでいくという工夫のないスタイルが売りです。(汗
Haskell入門コーナー
「カリー化って何が嬉しいの?」
という質問がありました。難しい質問ですね。(^^;
一つの説明として、このエントリーで書いたように、Haskellのように全ての引数がカリー化されていることによって、引数の解釈の柔軟性が飛躍的に増すというのがあると思います。
また、多引数関数に値を部分適用させて特化した関数を作るというのもよく行われます。
簡単な例をだすと、「2つの数を足す」という関数に対して、「3を足す」という特化型の関数を生成することによって、fmapなどの1引数関数を取る関数に渡して演算させる事ができます。
fmap (+3) [1,2,3]
・・・まあ、カリー化しているので、先に数字のリストを足し算のリストに変換して、それに「関数を受けて3を適用する」関数を適用することでも同じ計算ができるのですが・・・・。
fmap ($3) $ fmap (+) [1,2,3]
ちょっと、ラビリンスに迷い込みそうなのでこの辺で。(^^;
第13章「モナドがいっぱい」最後
モナド則についてです。
結果、記号の羅列で解りにくいという結論に。(^^;
第14章「もうちょっとだけモナド」
Writerモナドです。
どうやら、13章が失敗系モナドで、14章は状態系モナドの説明みたいです。
状態系モナドは、難しい系モナドなので難しいのですが、デザインパターンとしては関数を数珠繋ぎにするというアイデアは共通しているので、そこが押さえられれば理解が進むんじゃないかと思います。
これも手前味噌ですが、このエントリーでStateモナドについて書きました。
モナドってなんで必要なの?
関数を数珠繋ぎにするためです。
っていうのは端折り過ぎですが、関数型言語は関数の入力と出力で全てを表現する必要があり、関数を組み合わせていく必要があるんですが、普通にやるとf(g(h(i(j(k())))))...と書くのも読むのも変更するのも辛い感じになってしまうので、何とかプラグマティックに組み替えられて汎用的で記述性の高い方式を求めた結果の現時点での結論なんだと思います。
副作用前提の世界から見ると、なんでわざわざこんな難しいことをしてまで関数を数珠繋ぎにしたいのか謎だとは思いますが、それでも「関数を副作用なく保つこと」のメリットが大きいのだと思います。
またしても自分のエントリーですが、関数を純粋に保つというのは、プログラムの複雑さを最小に抑える効果があります。
これは、プログラムの規模が大きくなればなるほど、指数的に効いてくる要素ですので、多少の難解さを伴っていても、どこかで必ずペイできるはずです。
また、関数型言語とその周辺環境が持つ独特な概念は、この「純粋さ」を保ちつつリアルワールドの複雑さを記述するのに必要なノウハウやセオリーの塊です。
それも、手続き型言語と袂を分かった半世紀前から蓄積されてきた叡智の結集ですので、これを勉強して自分のものにすることは、決して無駄にはならないと思います。
次回、第24回 第14章「もうちょっとだけモナド」続き
次回は、10/28に開催です。
モナドについて学びたい人、語りたい人、
これから始めたいと言う人も、是非ご参加ください。