如何使用使用连续传递样式编码的 Reader 类型

How to use a Reader type encoded with continuation passing style

我的印象是 a 类型的每个值都可以用连续传递样式的 rank-2 多态类型 newtype Id a = Id {runId :: forall r. (a -> r) -> r } 来描述。所以我派生了以下类型来相应地定义 Reader

newtype Reader e a = Reader {runReader :: forall r. ((e -> a) -> r) -> r}

然后我尝试构造一个这种类型的值并且运行它:

reader f = Reader (\k -> k f) -- where is f's argument?
runReader (reader id) -- what is the 2nd argument?

如果Reader在CPS中的编码及其类型是有效的,我将如何使用它?

reader f = Reader (\k -> k f) -- where is f's argument?

我们现在不必传递第二个参数。这与不涉及第二个参数的常规 data Reader e a = Reader (e->a)reader f = Reader f 非常相似。

runReader (reader id) -- what is the 2nd argument?

一般方程是

runReader (reader f) k = k f

所以,

runReader (reader f) id x = id f x = f x

你可以使用 f = id(它在真正的 reader monad 中的作用类似于 ask),但不要将它与提供的其他 id 混淆作为延续 k,恢复原来的 f.