如何使用使用连续传递样式编码的 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
.
我的印象是 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
.