すごいHaskell読書会 in 大阪 2週目 #15 : ATND https://atnd.org/events/63293
「すごい Haskell 読書会 in 大阪」2周目の第15回。今日は「第13章 モナドがいっぱい」の回でした。
数学の圏論のモナドってあまり印象に残ってないです。圏論自体、ホモロジー代数を勉強したときに必要になったから少し見た、という程度です。そういえば Snake Lemma の証明とか楽しかったのを思い出した。どうでもいい話ですね。
「第13章 モナドがいっぱい」の内容
13.1 アプリカティブファンクターを強化する
まずは、ファンクターやアプリカティブファンクターの復習。なにげに、この復習の箇所が分かりやすかったりします。アプリカティブ値は文脈を持つ値だ、と改めて言われると、なるほどそういう意味か、と腑に落ちる感じ。
そしてモナドが登場しますが、ここの説明では正直なに言ってるか全然分かりません。さらっと流しておきます。あとで分かるはず。
13.2 Maybe から始めるモナド
Maybe
って、この本で初めて登場したときは「ふーん、そんなのあるんだね」と思った程度で、こんなに長く付き合うことになるとは思ってませんでした。慣れてくると、便利だし大事だな、と感じます。
ここでは 13.1 で説明された内容が Maybe
を使って説明されて、まだ分からないけどもなんとなく雰囲気は感じられてきました。ここも、その程度でさらっと流します。
13.3 Monad 型クラス
さて、ようやく型クラスの定義です。>>
と fail
はデフォルト実装があるのでおいといて、return
と >>=
がキモですね。
>>=
の引数の値と関数が、ファンクターと逆になっていることに戸惑います。しかし、これは次のセクションで具体例を見ると、そのほうが良いことに気づきます。
13.4 綱渡り
Maybe
を活用する具体例が登場します。ピエールに関する記述のノリは謎ですが、全体的に説明が丁寧でよいです。
前のセクションとこのセクションでモナドがだいぶ分かった気分になれます。
13.5 do 記法
I/O アクションの記述で使っていた do 記法が、実はモナド用の構文だった、という話です。ここはまた、なに言ってるかよく分からないです。
この本って、分かりやすいところと分かりにくいところが混ざっているなあ、という気がしてしまいます。まあ、分かりやすいとか分かりにくいなんてのは個人の感覚で、僕と逆の感覚を持つ人もいると思うので、あんまり突っ込まないようにします。
13.6 リストモナド
今度は、リストを活用する具体例が登場します。リスト内包表記が実はモナドの構文だったというのはちょっとびっくりする話。
ナイトの移動の問題は分かりやすくてよいです。こういうのを見ると、Haskell いいね、と思います。
13.7 モナド則
最後に例によって法則の話。こういう法則の話は個人的には好きですが、ちゃんと腑に落ちるには、もう少し手を動かしていかないといけないかな、と思っています。
数学でもそうでしたが、公理や法則は手を動かしていけばそのうち納得できるもの。いまは、そういうものがあるということを知っておけば十分。
練習問題
今回、用意された練習問題は、将棋盤に歩を打ったときに二歩になっていないかチェックするという、タイムリー(笑)な問題でした。
僕は最初 do 記法にこだわってしまって余計な時間をくってしまったために時間内に終わらなかったのですが、良問だったと思います。勉強になりました。