要从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变压器时是否需要考虑其他事项?