【发布时间】:2014-10-14 06:07:02
【问题描述】:
可以在带有延续单子的程序中向后跳转:
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.Fix
import Control.Monad.Trans.Cont
setjmp = callCC (\c -> return (fix c))
backward = do
l <- setjmp
-- some code to be repeated forever
l
但是当我尝试向前跳转时,GHC 不接受:
forward = mdo
l
-- some dead code
l <- setjmp
return ()
这不起作用,因为在Control.Monad.Trans.Cont 中定义的延续单子转换器ContT 没有MonadFix (ContT r m) 的实例。有关详细信息,请参阅Levent Erkok's thesis 的第 5.1 节。
有没有一种方法可以在没有值递归的情况下对延续单子进行前向跳转编码?
ContT 的替代定义是否有 MonadFix (ContT r m) 的实例? Magnus Carlsson 有一个 unpublished draft 提出了这样的建议,但我不知道在我的情况下该怎么做。
【问题讨论】:
-
我不确定是否有可能比@bennofs 的建议做得更好(尽管您可能可以定义一些帮助功能以使其不那么尴尬。)例如,
mdo l; x <- lift $ getChar; l <- setjmp; print x应该做什么,以及你将如何实现它? -
@ØrjanJohansen:好点子! (1)它应该做什么:应该暂停执行直到
x的值准备好print(在你的例子中,它永远不会准备好,所以它永远被暂停)。 (2)我如何实现它:这应该是懒惰的自动。 -
是否有更完整的示例来说明您要完成的工作?你可以用参数跳回去,也许这对你的任务来说已经足够了?
-
@JohnL:我只想了解延续。我读到延续足以用函数式语言实现 goto 。但是我看不到如何在 Haskell 中前进。请写一个关于“跳跃参数”的答案。
-
也许你在问
Monad Goto。试试这个:hackage.haskell.org/package/GotoT-transformers-1.0.0.1/docs/…
标签: haskell functional-programming monads continuations monad-transformers