IOモナドは関数の形であり、FUN[WORLD=>PAIR[T,WORLD]]であることに注意が必要、その分ややこしくなっている。
したがってunit:: T => IO[T] のIO[T]の部分が上記の関数の形になっていることが
下記のスクリプトで確かめられる。
anyがT、 (world) => return pair.cons(any, world);がFUN[WORLD=>PAIR[T,WORLD]]ということ。
また、flatMap:::: IO[T] => FUN[T => IO[U]] => IO[U]としてみると
instancdAが IO[T]、actionABがFUN[T => IO[U]] 、 return (world) => 以降が IO[U]ということになる。
actionABはT からIO[U]を作る関数で、TはIO[T]つまりnewPair = instanceA(world)のnewPair (value, newWorld) からvalue(ここではT)をmatchを使って取り出してる。
確かに、actionAB(value)(newWorld)はFUN[T => IO[U]] つまりFUN[T =>FUN[WORLD=>PAIR[U,WORLD]] ] (∵IO[U]=FUN[WORLD=>PAIR[U,WORLD]])となっていることが確認できる。
var IO = {
unit: (any) => {
return (world) => { return pair.cons(any, world); };
},
flatMap: (instanceA) => {
return (actionAB) => {
return (world) => {
var newPair = instanceA(world); // 現在の外界で instanceA実行
return pair.match(newPair,{
cons: (value, newWorld) => {
return actionAB(value)(newWorld); // 新しい外界で、actionAB(value)で作られたIOアクションを実行
}
});
};
};
},
0 件のコメント:
コメントを投稿