我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展,并试图弄清楚 GHC 如何编译递归 do-bindings(使用 -XDoRec 启用)。
我想知道一元定点组合器是否可能以严格的语言存在(如 Ocaml/F#/SML/...)?
如果是,它会是什么样子?会不会很有用?
问问题
409 次
1 回答
14
F# 计算表达式语法(与 Haskell 相关do
)支持递归:
let rec ones = seq {
yield 1
yield! ones }
Delay
这是支持的,因为除了其他 monadic(或MonadPlus)操作之外,计算构建器还必须支持操作。代码被翻译成如下内容:
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-21T17:00:40.807 回答