Open10
Haskellモナド学習録
学習前の状態
- 関数型言語はOCamlとF#をある程度触ったことがある
- Haskellに関する知識:
- 純粋関数型言語らしい
- 遅延評価らしい
- モナドなるものが特徴的らしい
この辺り↑で基本をサクッと勉強。モナド周りが全然わからんのでこのスクラップを立てた
いろんなモナド入門を見て回った結果、大まかな概念は理解できた。
モナド自体はだいぶ抽象的な概念(I/O, List, Maybeその他もろもろを1概念に束ねるほど)なので、理解するにはまずいろんな具体例をいろんな視点から見て、それらの共通点を見出していくのが良い。そのためにはいろんなモナド入門を見て回るのが良い。
どの視点が一番刺さるかは人によりそう。個人的に刺さったのは以下↓
https://qiita.com/suin/items/0255f0637921dcdfe83b
絵がいっぱいなので視覚的に理解できる。ユーモアがあって良い。
事例をいくつか挙げてから、それらをモナドに統一していく。個人的には一番理解の手助けになった。
.apply
と .then
が >>=
に見えてくる。
5種類の"composition"を挙げて類推させてくれる。
工場の組み立てラインのアナロジー。
その他よくまとまってそうなもの
モナドの説明のアプローチは様々
- 「returnとbind」派
- 「コンテナとそれに入った値」派
- ...
Q. モナドを知りたいのにFunctorとApplicativeが横入りしてくる
A. そいつらは割と理解の手助けになる
Q. モナド則も割り込んでくる
A. そいつはとりあえず無視してもよさそう
Q. 圏論も邪魔してくる
A. そいつもとりあえず無視してもよさそう
逐次・反復・分岐の話
(メモ)
-
'a -> 'a option
型の関数を普通にチェーンするとmatch with
だらけになるよね(Listのmapやfilterのチェーンは型が同一なのでそうならない) - 状態を純粋な体系で扱うには、
state -> state * 'a
型のサンク的なものを使えばいけるよね、でもそれをチェーンするとmatch with
だらけになるよね
⇒ それ >>=
で簡潔になるね
...みたいな流れがわかりやすい?
がまさにその流れで説明していて良かった
F#のコンピューテーション式がモナドも扱える(モナドだけじゃないけど)