1

我的印象是,每个类型的值a都可以用newtype Id a = Id {runId :: forall r. (a -> r) -> r }连续传递风格的 2 级多态类型来描述。所以我派生了以下类型来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?

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

4

1 回答 1

1
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(就像ask在真正的 reader monad 中一样),但不要将它与id作为 continuation 提供的另一个混淆k,它会恢复原始的f.

于 2018-02-08T18:32:12.683 回答