fp-ts-contrib/lib/Do を用いた手続き型プログラミング
example
code:haskell
v :: Monoid i => Option i
v = do
x <- m
y <- m'
return $ x ⊕ y
code:typescript
const v = Do(option)
.bind('x', m)
.bind('y', m2)
.return(({x, y}) => mplus(x, y));
Do(Monad) でインスタンスを作り、メソッドチェインで変数環境を育てる。
operators
L(azy)がpostfixに付くoperatorは、それまでの計算エフェクトに依存した計算ができる。
逆に、 L がついてないoperatorsはそれまでの計算エフェクトに依存した計算ができず、変数環境を触ることができない。
do, doL :: forall a b. m a -> m b -> m b, :: forall a b. ENV -> m a -> m b -> m b
計算エフェクトを実行するが変数には束縛しない。
code:haskell
_ <- m
code:typescript
.do(m)
bind, bindL :: forall a b. m a -> (a -> m b) -> m b, :: forall a b. ENV -> m a -> (a -> m b) -> m b
計算エフェクトを実行し、変数に束縛する。
code:haskell
x <- m
y <- g x
code:typescript
.bind('x', m)
.bindL('y', ({x}) => g x)
let, letL :: forall a b. a -> (a -> m b) -> m b, :: forall a b. ENV -> a -> (a -> m b) -> m b
文脈に対してpureな値を束縛する。
code:haskell
let x = 3
y = f x
code:typescript
.let('x', 3)
.letL('y', ({x}) => f(x))
return :: ENV -> a -> m a
(インスタンスをdeconstructし、)計算エフェクトの結果を返す。
code:haskell
return x; -- 末尾位置
code:typescript
.return(({x}) => x);
done :: Env -> m Env
return とだいたい同じだが、環境をそのまま返す。
code:typescript
Do(M)
.bind('x', m)
.bind('y', m')
.let('z', v)
.done() // ==> {x, y, z} ;