【发布时间】:2017-11-17 05:36:39
【问题描述】:
我试图理解这个tutorial之后的一般延续。
但是,我很难理解第 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) }
即状态转换表示为从状态到结果和状态元组的函数,这符合我的第一个理解。
谁能给个指导?
其次,我应该如何使用 Haskell 的 Control.Monad.Trans.Cont 在这里实现 get?我在调整类型系统时遇到问题。
更新
看来我得到了第二个:
Prelude Control.Monad.Trans.Cont> let get () = shift $ \k -> return $ \i -> k i i
但我仍然不明白为什么我需要将状态两次应用于延续。
【问题讨论】:
-
@Bergi 它实际上被称为 OchaCaml。我正在学习本教程,但我认为在这种情况下使用的语言不会影响对概念的理解。
标签: haskell ocaml continuations state-monad delimited-continuations