我试图理解在这个教程之后的一般延续。
然而,我很难理解第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实现相比,混乱增加了更多:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }也就是说,状态转换表示为从状态到结果和状态的元组的函数,这与我的第一个理解是一致的。
有人能给出线索吗?
其次,我应该如何在这里使用Haskell的get实现Control.Monad.Trans.Cont?我在安慰这种类型的系统方面有问题。
更新
我好像收到了第二个:
Prelude Control.Monad.Trans.Cont> let get () = shift $ \k -> return $ \i -> k i i但我还是不明白为什么我要用国家两次来继续下去。
发布于 2017-06-15 01:25:10
您可以将k两次应用到state上,因为第一个对应于get ()的结果(我们希望get的效果是检索当前状态并将其作为结果返回),而第二个对应于在get之后传递状态(因为get不改变状态,所以与get之前的状态相同)到下一个有状态计算。
换句话说,由于状态monad是State s a ~ s -> (a, s),所以它的CPS版本是State s r a ~ s -> (a -> s -> r) -> r,所以对于get : State s s,因为a ~ s,延续将是s -> s -> r类型的函数。
https://stackoverflow.com/questions/44555410
复制相似问题