我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展,并试图弄清楚 GHC 如何编译递归 do 绑定(使用 -XDoRec 启用)。
我想知道一元定点组合器是否可能以严格的语言存在(如 Ocaml/F#/SML/...)?
如果是的话,它会是什么样子?会不会很有用呢?
F# 计算表达式语法(与 Haskell 相关)do
) 支持递归:
let rec ones = seq {
yield 1
yield! ones }
这是支持的,因为计算构建器必须支持Delay
除了其他单子(或莫纳德加) 运营。代码被翻译成这样:
let rec ones =
seq.Combine
( seq.Yield(1),
seq.Delay(fun () -> seq.YieldFrom(ones)) )
的类型Delay
一般来说,(unit -> M<'T>) -> M<'T>
诀窍在于它将带有效果(或立即递归引用)的计算包装到按需评估的延迟计算中。
如果您想了解有关 F# 中该机制如何工作的更多信息,那么以下两篇论文是相关的:
- 语法问题:在 F# 中编写抽象计算 http://www.cl.cam.ac.uk/~tp322/drafts/notations.html
- 初始化相互引用的抽象对象:值递归挑战 http://research.microsoft.com/apps/pubs/default.aspx?id=79951
第一个描述如何对 F# 计算表达式语法进行脱糖(以及如何Delay
插入 - 一般来说,F# 如何将延迟计算和急切计算与效果结合起来),第二个描述 F# 如何处理let rec
带有值的声明 - 就像ones
值以上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)