如何理解嵌套CPS挂起类型?基于Cont类型的技术解析
聊聊CPS挂起计算的嵌套高阶类型
嘿,咱们从大家都熟悉的CPS挂起计算类型(a -> r) -> r聊起吧——在Haskell的mtl库里面,它有个正式的名字叫Cont r a。这里有个很关键的特性要划重点:只要类型参数r保持多态性,Cont r a就和a是同构的,这也是这类挂起计算的核心性质之一。
如果我们把这个挂起计算类型嵌套起来,就能得到一个3阶的类型:
forall r. ((forall s. (a -> s) -> s) -> r) -> r
(其实我本来可以先定义一个更简洁的类型别名:type Susp a = forall r. (a -> r) -> r,然后直接讨论Susp (Susp a)就好,但怕这样会引出一些和核心话题无关的技术细节,所以就直接把完整的3阶类型写出来啦)
这个嵌套类型本质上就是对“挂起计算的挂起计算”再做一次CPS封装:外层的forall r. (...) -> r维持了最外层的多态性约束,而内层的forall s. (a -> s) -> s就是我们最开始提到的、和a同构的基础挂起计算类型。
内容的提问来源于stack exchange,提问作者duplode
相关产品推荐
相关产品推荐

