CPL で Stateモナド を作ってみた。ちゃんと出来てるかどうかは分からない。
参考記事
コード
# State Monad # newtype State s a = State { runState :: s -> (s, a) } right object State(S, A) with state is runState: State -> Exp(S, Prod(A, S)) end object; let run(x) = ev.pair(runState.state(cur(x)), s.o);
ev.pair
の第二引数1(s.o)
が初期状態だ。
実行結果
> let run(x) = ev.pair(runState.state(cur(x)), s.o) x: Prod(1,nat) -> Prod(*a,nat) ------------------------------ run(x): 1 -> Prod(*a,nat) cpl> simp full run(Prod(true, s)) pair(true,s.s.o) : 1 -> Prod(bool,nat) cpl> simp full run(Prod(true.!, s).Prod(true, s)) pair(true.!,s.s.s.o) : 1 -> Prod(bool,nat) cpl>
Stateモナド の実体としては、カリーcur
をかぶせたProd
を置く。
第一引数には返したい結果、第二引数には状態を更新する関数(ここではnat->nat
)を置く。
連鎖させることもできる※1。Prod(true.!, s).Prod(true, s)
のように。(!
は後方の合成射を全て消すものです)
(※1 bind じゃないよな?)
で、bind(>>=)は?
分からない......