10
我正在为Ocaml中的haskell-like标记做camlp4扩展,并试图弄清楚GHC如何编译递归do-bindings(使用-XDoRec启用)。
我想知道是否有可能以严格的语言(如Ocaml/F#/ SML/...)存在monadic fixpoint combinator?
如果是,它怎么样?它会非常有用吗?MonadFix以严格的语言编写
我正在为Ocaml中的haskell-like标记做camlp4扩展,并试图弄清楚GHC如何编译递归do-bindings(使用-XDoRec启用)。
我想知道是否有可能以严格的语言(如Ocaml/F#/ SML/...)存在monadic fixpoint combinator?
如果是,它怎么样?它会非常有用吗?MonadFix以严格的语言编写
的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
值。
所以,不 - 不可能以纯粹严格的方式。由于所有的函数式语言都有一些懒惰的概念(主要是使用函数,闭包和变量),所以它可以通过懒惰的结构以“严格的语言”来实现。 – 2013-03-21 18:00:47
通常懒惰已经存在,但是如果你的monad支持抽象类型,OCaml不会让你利用它 - “这种表达不允许作为'let rec'的右边。在这种情况下,你需要寻找虚假的“单位”参数(或者如果你需要记忆,也许是“懒惰”......) – lukstafi 2013-03-23 14:24:03