F#(至少在 Visual Studio 2012 中)同时具有Control.Observable
和Control.Event
.
- 它们有什么关系?
- 什么时候应该用哪一个?
- 两者之间有性能差异吗?
我也很想知道 .NET 的 Haskell 模块 / 包 / 特性IEnumerable
/通过对 .NET 的反应式扩展IObservable
实现的二元性对应于什么。
F#(至少在 Visual Studio 2012 中)同时具有Control.Observable
和Control.Event
.
我也很想知道 .NET 的 Haskell 模块 / 包 / 特性IEnumerable
/通过对 .NET 的反应式扩展IObservable
实现的二元性对应于什么。
IEvent
要回答您问题的第一部分,和之间存在许多差异IObservable
。之所以有两种相似的类型,是因为它们IEvent
是为 F# 设计的(早期主要是出于兼容性原因而将其保留在那里),并且该IObservable
类型后来被添加到 .NET 中(因此 F# 也添加了对它的支持)。以下是一些区别:
IEvent
不支持删除事件处理程序,因此当您创建处理管道(组合map
等filter
)然后调用RemoveHandler
生成的事件时,它会留下一些附加处理程序(是的,这是一个泄漏,我们写了一篇关于它的更详细的论文)另一方面IObservable
是能够删除处理程序。
作为前一点的结果,IObservable
关于有状态组合器的行为不同。例如,当您使用 时Event.scan
,您可以将多个处理程序附加到结果事件,它们将看到相同的状态。IObservable
为每个附加的处理程序创建一个“新状态”(除非您明确使用主题)。
在实际的 F# 编程中,这意味着:
IObservable
如果您希望能够删除事件处理程序(使用RemoveHandler
或AwaitObservable
在 F# 异步工作流中使用时),您通常应该更喜欢。
如果要声明事件(可从 C# 使用),则需要创建类型的属性,IEvent
因此需要使用Event
组合器。
正如评论中提到的,F# 模型深受函数响应式编程 (FRP) 的影响,这是一个最初在 Haskell 中开发的想法,因此您应该找到很多类似的库。F# 版本“不那么纯粹”,以便对 .NET 编程更实用。