F#(至少在Visual Studio 2012中)同时包含Control.Observable
和Control.Event
。
我还想知道Haskell模块/包/功能与.NET 的反应式扩展所实现的.NET IEnumerable
/ IObservable
二元性相对应。
答案 0 :(得分:8)
要回答问题的第一部分,IEvent
和IObservable
之间存在许多差异。有两种相似类型的原因是IEvent
是为F#设计的(早期并且主要出于兼容性原因而留在那里),后来将IObservable
类型添加到.NET(和所以F#也加入了对它的支持。以下是一些差异:
IEvent
不支持删除事件处理程序,因此在创建处理管道时(合并map
,filter
和其他人)和然后在结果事件上调用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编程。