-->

MonadFix严格的语言(MonadFix in strict language)

2019-08-17 20:51发布

我正在camlp4扩展OCaml中哈斯克尔样做记号,并试图找出如何GHC编译递归DO-绑定(与-XDoRec启用)。
我不知道是否有可能为一元不动点组合子,以严格的语言存在(如ocaml的/ F#/ SML / ...)?
如果是的话,怎么能是什么样子? 难道是非常有用吗?

Answer 1:

在F#计算表达式语法(与哈斯克尔do )支持递归:

let rec ones = seq {
  yield 1
  yield! ones }

这是支持,因为计算生成器已经可以支持Delay除了其他一元(或MonadPlus)操作的操作。 该代码被翻译成这样的:

let rec ones = 
  seq.Combine
    ( seq.Yield(1),
      seq.Delay(fun () -> seq.YieldFrom(ones)) )

的类型的Delay是,在一般情况下, (unit -> M<'T>) -> M<'T>和诀窍是,它包装与被评估的效果(或立即递归引用)到一个延迟计算的计算一经请求。

如果您想了解更多有关机制,F#是如何工作的,那么下面的两篇论文是相关的:

  • 语法问题:写作F#抽象的计算
  • 初始化相互借鉴抽象对象:价值递归挑战

第一个描述了F#计算表达式语法如何脱糖(以及如何Delay插入-和在一般情况下,如何F#结合影响延迟和渴望的计算),而第二个描述F#把手如何let rec与值声明-如ones值之上。



文章来源: MonadFix in strict language