Tom*_*cek 14
F#计算表达式语法(与Haskell相关do)支持递归:
let rec ones = seq {
yield 1
yield! ones }
Run Code Online (Sandbox Code Playgroud)
这是受支持的,因为Delay除了其他monadic(或MonadPlus)操作之外,计算构建器还必须支持操作.代码被翻译成类似的东西:
let rec ones =
seq.Combine
( seq.Yield(1),
seq.Delay(fun () -> seq.YieldFrom(ones)) )
Run Code Online (Sandbox Code Playgroud)
Delay通常,类型(unit -> M<'T>) -> M<'T>是,它将带有效果(或立即递归引用)的计算包装到按需评估的延迟计算中.
如果您想进一步了解该机制在F#中的工作原理,那么以下两篇论文是相关的:
第一个描述了如何使用F#计算表达式语法(以及如何Delay插入 - 以及通常,F#如何将延迟和急切计算与效果结合起来),第二个描述F#如何let rec使用值处理声明 - 如ones上面的值.