我如何创建一个;“主题”;F#可观察到?

我如何创建一个;“主题”;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#的

在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#的内置
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的一个(更小的)替代品?看起来是这样的。我没有意识到这一点。