run
するまではクエリは走らないm*
やms*
ができた段階ではまだクエリは走ってない
- 長いモナド型は途中の操作の種類を記憶している
- N個のモナドに対する操作は同じ種類の操作でないといけない (というのを型が保証している)
- 同じ種類の操作なので各ステップはまとめてやれる
Seq[モナド型]
に対するrun
は各ステップをまとめて実行FlatMapped[]
の場合はこのへん- ひとつ前までのモナドのリストをまとめて
run
- 得られた結果を
flatMap()
に渡された関数f
に施す (これはそれぞれ)f
はまたモナドを返すf
の中ではモナドを作るだけ(toCrankshaft
等)でクエリはまだ走らない
f
が返したモナドを集めたリストをふたたびまとめて実行
- ひとつ前までのモナドのリストをまとめて
Resolve[]
の場合はこのへんResolve[]
はtoEngine
やtoCrankshaft
したときに作られる(HasA.Monadic
が返すもの)toEngine
やtoCrankshaft
のレシーバの値をもっている- レシーバの値を集めてリストにしたものを
HasA.map()
にまとめて渡すことでrun
する - 渡す先の
HasA
インスタンスはモナドのリストの先頭のもの
FlatMapped[]
やResolve[]
,Unit[]
は実際は基底型のSig[]
で表されていたりもします (わかりやすいように具体的に書きました)