延续的结果一定是最终结果吗?

时间:2018-11-04 22:23:45

标签: haskell continuations

要从Cont r a类型生成最终结果,您需要将其传递给runCont并提供类型(a -> r)的延续:

runCont :: Cont r a -> (a -> r) -> r

签名仅告诉我们,延续的返回值必须具有与最终结果相同的 type r,但没有告诉我们返回值延续的必须是最终结果。

在返回最终结果之前,我实际上可以对r做一些进一步的处理。在这里,我在结果前加上了一个字符串:

cnt :: Num p => p -> Cont String p
cnt x = let f k = "result=" ++ k (x+1)
        in cont f

λ> runCont (cnt 1) show
"result=2"

λ> runCont (cnt 1) (flip take "Hello")
"result=He"

但是,通常说延续是其余的计算。这表明它的返回值在Cont内没有做进一步处理,并且 是最终结果。

我有种感觉,直接返回那个r值,给我一个尾部调用,并且最小限度地限制了r的可能类型,但是我不确定这是否正确,而不是确定这就是整个故事。

  • 是否应该避免继续处理续集的返回值,或者这是完全正常的吗?
  • r的进一步处理是否有任何弊端,甚至会破坏事情?
  • 使用ContT monad变压器时是否需要考虑其他事项?

0 个答案:

没有答案