F#中的Control.Observable和Control.Event模块之间有什么相似之处/不同之处?

Cet*_*ert 11 events f# haskell

F#(至少在Visual Studio 2012中)具有Control.ObservableControl.Event.

  • 它们有什么关系?
  • 应该使用哪一个?
  • 这两者之间是否存在性能差异?

我还想知道通过.NET的反应式扩展所实现的.NET IEnumerable/ IObservable对偶性的Haskell模块/包/功能.

Tom*_*cek 8

要回答问题的第一部分,IEvent和之间存在许多差异IObservable.有两种相似类型的原因是IEvent为F#设计的(之前它主要出于兼容性原因而留在那里),并且IObservable稍后将类型添加到.NET(因此F#也添加了对它的支持).以下是一些差异:

  • IEvent不支持删除事件处理程序,所以当你创建一个处理管道(组合map,filter和其他)然后调用RemoveHandler结果事件时,它会留下一些处理程序(是的,这是一个泄漏,我们写了一篇关于它的更详细的文章)另一方面IObservable可以删除处理程序.

  • 作为前一点的结果,IObservable对于有状态组合器的行为不同.例如,在使用时Event.scan,可以将多个处理程序附加到生成的事件中,它们将看到相同的状态.IObservable为每个附加的处理程序创建一个"新状态"(除非您明确使用主题).

在实际的F#编程中,这意味着:

  • IObservable如果您希望能够删除事件处理程序(在F#异步工作流中使用RemoveHandler或使用)AwaitObservable,通常应该更喜欢.

  • 如果要声明事件(可从C#使用),则需要创建类型属性,IEvent因此需要使用Event组合器.

正如评论中所提到的,F#模型受功能反应式编程(FRP)的影响很大,这是一个最初在Haskell中开发的思想,所以你应该找到很多类似的库.F#版本"不太纯粹",以便更加实用于.NET编程.

  • @devouredelysium我已经更新了论文的链接.如果链接再次破裂,标题是"收集好莱坞的垃圾:避免复合事件中的空间泄漏". (2认同)