2017年5月5日金曜日

関数型プログラミングの基礎 IOモナド

 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 件のコメント:

コメントを投稿