我试图在本教程之后理解一般的延续。
但是,我很难理解第 2.10 节中的以下示例:
# let get () =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state
是int
我想的类型。我不明白的是k
. 根据我的理解,k
捕获所有计算随后发生在 之后get ()
,并且由于我们正在谈论一个状态单子,k
因此可以合理地表示将通过一个 继续进行的计算int
,因此
k : int => 'a
但从代码来看,它似乎并没有这样做,它需要state
第二次,这实际上意味着:
k : int => int => 'a
但我不知道第二个是从哪里来的,在哪种意义上get
是类型unit => 'a
而不是unit => int => 'a
?
与实际的 state monad 实现相比,混乱增加了更多:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
即状态转换表示为从状态到结果和状态的元组的函数,这符合我的第一个理解。
任何人都可以领导吗?
其次,我应该如何get
使用 Haskell 在这里实现Control.Monad.Trans.Cont
?我在安慰类型系统时遇到问题。
更新
看来我得到了第二个:
Prelude Control.Monad.Trans.Cont> let get () = shift $ \k -> return $ \i -> k i i
但我仍然不明白为什么我需要将状态两次应用于延续。