2013-03-21 37 views
10

我正在为Ocaml中的haskell-like标记做camlp4扩展,并试图弄清楚GHC如何编译递归do-bindings(使用-XDoRec启用)。
我想知道是否有可能以严格的语言(如Ocaml/F#/ SML/...)存在monadic fixpoint combinator?
如果是,它怎么样?它会非常有用吗?MonadFix以严格的语言编写

回答

14

的F#计算表达式语法(与哈斯克尔do)支持递归:

let rec ones = seq { 
    yield 1 
    yield! ones } 

这是支持,因为计算生成器已经可以支持除了其他一元(或MonadPlus)操作Delay操作。该代码被转换成这样的:

let rec ones = 
    seq.Combine 
    (seq.Yield(1), 
     seq.Delay(fun() -> seq.YieldFrom(ones))) 

类型的Delay是,一般来说,(unit -> M<'T>) -> M<'T>和诀窍是,它包装有效果(或立即递归引用)到被评价上的延迟计算的计算需求。

如果您想了解更多关于该机制在F#中是如何工作的,那么下面的两篇论文是相关的:

第一个介绍了如何在F#计算表达式语法已被解除(以及如何插入Delay - 以及一般情况下,F#如何将延迟和渴望的计算与效果相结合),第二个描述了F#如何处理let rec带值的声明 - 如上面的ones值。

+0

所以,不 - 不可能以纯粹严格的方式。由于所有的函数式语言都有一些懒惰的概念(主要是使用函数,闭包和变量),所以它可以通过懒惰的结构以“严格的语言”来实现。 – 2013-03-21 18:00:47

+0

通常懒惰已经存在,但是如果你的monad支持抽象类型,OCaml不会让你利用它 - “这种表达不允许作为'let rec'的右边。在这种情况下,你需要寻找虚假的“单位”参数(或者如果你需要记忆,也许是“懒惰”......) – lukstafi 2013-03-23 14:24:03