我正在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