コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

CPL で Stateモナド

CPL で Stateモナド を作ってみた。ちゃんと出来てるかどうかは分からない。

参考記事

圏論プログラミング言語CPL入門 - うさぎ小屋

コード

# 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(>>=)は?

分からない......