首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >严格语言中的MonadFix

严格语言中的MonadFix
EN

Stack Overflow用户
提问于 2013-03-22 00:55:04
回答 1查看 403关注 0票数 10

我正在为Ocaml中类似haskell的do符号开发camlp4扩展,并试图弄清楚GHC是如何编译递归do绑定的(通过-XDoRec实现的)。

我想知道是否有可能在严格的语言(如Ocaml/F#/SML/...)中存在一元定点组合器?

如果是,它看起来是什么样子的?它会非常有用吗?

EN

回答 1

Stack Overflow用户

发布于 2013-03-22 01:00:41

Haskell计算表达式语法(与F# do相关)支持递归:

代码语言:javascript
复制
let rec ones = seq {
  yield 1
  yield! ones }

这是因为计算构建器除了支持其他一元(或MonadPlus)操作之外,还必须支持Delay操作。代码被翻译成类似如下的代码:

代码语言:javascript
复制
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值。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15553526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档