【发布时间】:2011-05-28 14:44:25
【问题描述】:
我正在尝试设计一个 Rx Builder 以在 F# 计算表达式语法中使用反应式扩展。如何修复它以使其不会炸毁堆栈?就像下面的 Seq 示例。 是否有计划将 RxBuilder 的实现作为响应式扩展的一部分或作为 .NET Framework 未来版本的一部分?
open System
open System.Linq
open System.Reactive.Linq
type rxBuilder() =
member this.Delay f = Observable.Defer f
member this.Combine (xs: IObservable<_>, ys : IObservable<_>) =
Observable.merge xs ys
member this.Yield x = Observable.Return x
member this.YieldFrom (xs:IObservable<_>) = xs
let rx = rxBuilder()
let rec f x = seq { yield x
yield! f (x + 1) }
let rec g x = rx { yield x
yield! g (x + 1) }
//do f 5 |> Seq.iter (printfn "%A")
do g 5 |> Observable.subscribe (printfn "%A") |> ignore
do System.Console.ReadLine() |> ignore
【问题讨论】:
-
您是否查看过最新 Rx 版本中的
Expand运算符?它处理某些递归场景。 -
你会如何应用 Observable.Expand 来解决这个问题?你有任何解释 Expand 语义的链接吗?
-
@Ramon:这是 Holoed 的博客 :)
标签: f# system.reactive computation-expression