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