gpt4 book ai didi

haskell - MonadFix 严格的语言

转载 作者:行者123 更新时间:2023-12-04 03:28:48 28 4
gpt4 key购买 nike

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

最佳答案

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# 中的工作原理,那么以下两篇论文是相关的:
  • Syntax Matters: Writing abstract computations in F#
  • Initializing Mutually Referential Abstract Objects: The Value Recursion Challenge

  • 第一个描述了 F# 计算表达式语法是如何脱糖的(以及如何插入 Delay - 通常,F# 如何将延迟和急切的计算与效果相结合),第二个描述 F# 如何处理 let rec带有值的声明 - 如 ones上面的值。

    关于haskell - MonadFix 严格的语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15553526/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com