10

我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展,并试图弄清楚 GHC 如何编译递归 do-bindings(使用 -XDoRec 启用)。
我想知道一元定点组合器是否可能以严格的语言存在(如 Ocaml/F#/SML/...)?
如果是,它会是什么样子?会不会很有用?

4

1 回答 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 回答