【发布时间】:2015-11-09 07:29:18
【问题描述】:
经过一些研究([1]、[2]、[3] 等),我正在尝试通过自己尝试一些示例来完成延续单子的工作。
[1] 的第二个答案建议使用延续来表达阶乘。我的解决方案如下:
Cont ($ (fact 0)) = return 1
Cont ($ (fact n)) = Cont ($ (fact (n-1))) >>= (\x -> Cont ($ (n*x)))
我在纸上做了一些模拟,解决方案应该是正确的。
但是我无法让它被 GHC 消化。当然我重命名了fact函数,但还是不开心。
我最近的尝试是https://gist.github.com/Muzietto/595bef1815ddf375129d
并一如既往地提供parse error in pattern \c -> .....
谁能建议这些定义的运行实现?
[1]How and why does the Haskell Cont monad work?
[2]http://hackage.haskell.org/package/mtl-1.1.0.2/docs/Control-Monad-Cont.html
【问题讨论】:
-
首先:要点本身很好,但是你为什么不在这里复制和粘贴代码 - 这对我们在这里提供帮助很方便 - 接下来我认为你的类型不匹配(或者我猜你想做什么是错的) - 你是否尝试过仅使用 continuation-passing-style 来解决这个问题(你并不完全需要 monad/
Cont-wrapper 来理解该技术)? -
@carsten - 我的这个尝试确实源于一个完美运行的 CPS 实施,绝对是微不足道的。我相信很明显这个问题的全部意义在于使用 monad,尤其是它的 bind 函数。
标签: haskell monads continuations