Open10

Haskellモナド学習録

SphendamiSphendami

学習前の状態

  • 関数型言語はOCamlとF#をある程度触ったことがある
  • Haskellに関する知識:
    • 純粋関数型言語らしい
    • 遅延評価らしい
    • モナドなるものが特徴的らしい
SphendamiSphendami

いろんなモナド入門を見て回った結果、大まかな概念は理解できた。
モナド自体はだいぶ抽象的な概念(I/O, List, Maybeその他もろもろを1概念に束ねるほど)なので、理解するにはまずいろんな具体例をいろんな視点から見て、それらの共通点を見出していくのが良い。そのためにはいろんなモナド入門を見て回るのが良い。
どの視点が一番刺さるかは人によりそう。個人的に刺さったのは以下↓


https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
和訳:https://qiita.com/suin/items/0255f0637921dcdfe83b
絵がいっぱいなので視覚的に理解できる。ユーモアがあって良い。


http://www.mew.org/~kazu/material/2011-monad.pdf
事例をいくつか挙げてから、それらをモナドに統一していく。個人的には一番理解の手助けになった。


https://samgrayson.me/2019-08-06-monads-as-a-programming-pattern/
.apply.then>>= に見えてくる。


https://tutswiki.com/yet-another-lousy-monad-tutorial/
5種類の"composition"を挙げて類推させてくれる。


https://www.sampou.org/haskell/a-a-monads/html/analogy.html
工場の組み立てラインのアナロジー。

SphendamiSphendami

モナドの説明のアプローチは様々

  • 「returnとbind」派
  • 「コンテナとそれに入った値」派
  • ...
SphendamiSphendami

Q. モナドを知りたいのにFunctorとApplicativeが横入りしてくる
A. そいつらは割と理解の手助けになる

Q. モナド則も割り込んでくる
A. そいつはとりあえず無視してもよさそう

Q. 圏論も邪魔してくる
A. そいつもとりあえず無視してもよさそう

SphendamiSphendami

(メモ)

  • 'a -> 'a option 型の関数を普通にチェーンすると match with だらけになるよね(Listのmapやfilterのチェーンは型が同一なのでそうならない)
  • 状態を純粋な体系で扱うには、state -> state * 'a 型のサンク的なものを使えばいけるよね、でもそれをチェーンすると match with だらけになるよね

⇒ それ >>= で簡潔になるね

...みたいな流れがわかりやすい?

SphendamiSphendami

F#のコンピューテーション式がモナドも扱える(モナドだけじゃないけど)