F#(至少在 Visual Studio 2012 中)有 Control.Observable
和 Control.Event
。
我也很想知道 .NET
IEnumerable
/IObservable
对偶性的 Haskell 模块/包/特性对应于 .NET 的 react 性扩展。 最佳答案
要回答您问题的第一部分, 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
。 IEvent
类型的属性,因此需要使用 Event
组合子。 正如评论中提到的,F# 模型深受函数式响应式(Reactive)编程 (FRP) 的影响,这是一个最初在 Haskell 中开发的想法,因此您应该找到大量类似的库。 F# 版本“不那么纯粹”,以便更适用于 .NET 编程。
关于events - F# 中 Control.Observable 和 Control.Event 模块之间的异同点是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11747861/