F#(至少在 Visual Studio 2012 中)两者兼而有之Control.Observable http://msdn.microsoft.com/en-us/library/ee370313(v=vs.110).aspx and Control.Event http://msdn.microsoft.com/en-us/library/ee340422(v=vs.110).aspx.
- 它们有何关系?
- 什么时候应该使用哪一个?
- 两者之间有性能差异吗?
我还想知道 .NET 的 Haskell 模块/包/功能有哪些IEnumerable
/ IObservable
对偶性实现.NET 的反应式扩展相当于。
要回答您问题的第一部分,两者之间存在许多差异IEvent
and IObservable
。之所以有两种相似的类型是因为IEvent
是为 F# 设计的(较早,主要出于兼容性原因而保留)并且IObservable
type 后来被添加到 .NET(因此 F# 也添加了对它的支持)。以下是一些差异:
IEvent
不支持removing事件处理程序,因此当您创建处理管道时(结合map
, filter
和其他)然后打电话RemoveHandler
在生成的事件上,它会附加一些处理程序(是的,这是一个泄漏,我们写了一篇更详细的论文 http://tomasp.net/academic/papers/hollywood/)
另一方面IObservable
能够删除处理程序。
由于前一点的结果,IObservable
对于有状态组合器的行为有所不同。例如,当您使用Event.scan
,您可以将多个处理程序附加到生成的事件,它们将看到相同的状态。IObservable
为每个附加的处理程序创建一个“新状态”(除非您显式使用主题)。
在实际的 F# 编程中,这意味着:
正如评论中提到的,F# 模型深受函数反应式编程 (FRP) 的影响,这是一个最初在 Haskell 中开发的想法,因此您应该找到大量类似的库。 F# 版本“不太纯粹”,以便更实用地进行 .NET 编程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)