我如何创建一个;“主题”;F#可观察到?
在Rx中,我可以创建如下主题:我如何创建一个;“主题”;F#可观察到?,f#,observable,F#,Observable,在Rx中,我可以创建如下主题: let s = new Subject<int>() let subscription = s.Subscribe (fun x -> Console.WriteLine x ) s.OnNext 123 let s=new Subject() 让订阅= s、 订阅(乐趣x-> Console.WriteLine x ) s、 OnNext 123 主体既是可观察的,又是观察者。这在将回调转换为流时非常有用 使用F#的
let s = new Subject<int>()
let subscription =
s.Subscribe (fun x ->
Console.WriteLine x
)
s.OnNext 123
let s=new Subject()
让订阅=
s、 订阅(乐趣x->
Console.WriteLine x
)
s、 OnNext 123
主体既是可观察的,又是观察者。这在将回调转换为流时非常有用
使用F#的内置Observable
模块的等价物是什么 你说得对:
主体既是可观察的,又是观察者
要实现与Rx.NET
实现等效的功能,您必须自己提供构成主题
接口的缺失部分
模块中的所有值创建一个
IObserver
或最多返回两个IObservable
s;它不涉及主题s.在F#Snippets上有一个示例实现:
Subject类型实现了IObserver和IObservable。它在功能上等同于反应式扩展(Rx)库中相同名称的类型
可观察模块
开放系统
open System.Collections.Generic
键入主题>()
设iter f=observators |>Seq.iter f
让未完成()=
如果不停的话
已停止观察者。OnCompleted()
让onError ex()=
如果不停的话
停止观察者。OnError(ex))
让下一个值()=
如果不停的话
iter(趣味观察者->观察者.OnNext(值))
让我们移除观察者()=
观察者。移除观察者|>忽略
member x.Next value=lock sync如果您不喜欢直接使用System.Reactive.Subjects.Subject
,您可以使用FSharp.Control.Reactive
nuget包编写Subject.broadcast
。它包含了很多F#风格的可观测函数(虽然在这种情况下,我个人觉得奇怪的是,看起来像属性的东西更多的是构造函数)。我修复了你的链接,请确保它指向正确的位置。顺便问一下,这是否满足了使用内置可观察模块的要求。谢谢,编辑在我的链接前面加了“http”。现在它是正确的。我不认为内置的可观察模块提供了这一点;因此,菲利普·特里福德(Phillip Trelford)发布了一段很有帮助的片段:使用F#并不意味着你应该避免使用Rx;F#没有内置Rx“替代品”。正如在另一篇评论中提到的,FSharp.Control.Reactive
是一个包装器,可以使Rx从F#使用起来更友好。@TeaDrivenDev我认为可观测模块是Rx的一个(更小的)替代品?看起来是这样的。我没有意识到这一点。