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

时间:2012-07-31 19:47:59

标签: events haskell f#

F#(至少在Visual Studio 2012中)同时包含Control.ObservableControl.Event

  • 他们有什么关系?
  • 什么时候应该使用?
  • 两者之间是否存在性能差异?

我还想知道Haskell模块/包/功能与.NET 的反应式扩展所实现的.NET IEnumerable / IObservable二元性相对应。

1 个答案:

答案 0 :(得分:8)

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

  • IEvent不支持删除事件处理程序,因此在创建处理管道时(合并mapfilter和其他人)和然后在结果事件上调用RemoveHandler,它会留下一些处理程序(是的,这是泄漏和we wrote a more detailed paper about it) 另一方面,IObservable可以删除处理程序。

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

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

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

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

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