首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CPS版的国家单曲中`CPS‘是如何工作的?

在CPS版的国家单曲中`CPS‘是如何工作的?
EN

Stack Overflow用户
提问于 2017-06-14 22:01:18
回答 1查看 303关注 0票数 5

我试图理解在这个教程之后的一般延续。

然而,我很难理解第2.10节中的以下例子:

代码语言:javascript
复制
# let get () =
    shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>

我想stateint型的。我不明白的是k的类型。根据我的理解,k捕获了所有的计算,随后出现在get ()之后,而且由于我们讨论的是一个状态单点,所以k表示一个将通过一个int继续进行的计算是合理的,因此,

代码语言:javascript
复制
k : int => 'a

但是从代码中看,它似乎没有做到这一点,它第二次使用state,这实际上意味着:

代码语言:javascript
复制
k : int => int => 'a

但我不明白第二个问题是从哪里来的,从哪个意义上说,getunit => 'a型而不是unit => int => 'a

与实际的state实现相比,混乱增加了更多:

代码语言:javascript
复制
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }

也就是说,状态转换表示为从状态到结果和状态的元组的函数,这与我的第一个理解是一致的。

有人能给出线索吗?

其次,我应该如何在这里使用Haskell的get实现Control.Monad.Trans.Cont?我在安慰这种类型的系统方面有问题。

更新

我好像收到了第二个:

代码语言:javascript
复制
Prelude Control.Monad.Trans.Cont> let get () = shift $ \k -> return $ \i -> k i i

但我还是不明白为什么我要用国家两次来继续下去。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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类型的函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44555410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档