F#(至少在 Visual Studio 2012 中)有 Control.Observable Control.Event

  • 它们有什么关系?
  • 什么时候应该用哪一个?
  • 两者有性能差异吗?


  • 我也很想知道 .NET IEnumerable/IObservable 对偶性的 Haskell 模块/包/特性对应于 .NET 的 react 性扩展。

    最佳答案

    要回答您问题的第一部分, 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# 模型深受函数式响应式(Reactive)编程 (FRP) 的影响,这是一个最初在 Haskell 中开发的想法,因此您应该找到大量类似的库。 F# 版本“不那么纯粹”,以便更适用于 .NET 编程。

    关于events - F# 中 Control.Observable 和 Control.Event 模块之间的异同点是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11747861/

    10-16 09:09