7 monads concurrency f# system.reactive actor
我一直试图找到任何讨论什么时候你应该支持使用monads而不是actor(在并发场景中),但我什么都没发现.特别是,我想知道Reactive Extensions(LINQ to Events)与F#的MailboxProcessor的使用.除了你可能有的任何哲学推理之外,请举例说明.
更新 为了获得更好的上下文,Reactive Extensions以IObservable/IObserver的形式实现continuation monad.我不一定说我必须使用F#,只是说F#有一个具体的"actor模型",在.NET语言中以MailboxProcessor <'T>的形式提供.
我想要了解的是何时使用monad(在这种情况下是一个continuation monad)与一个actor模型用于并发目的.如果monad(据我所知)不引入状态,则actor有自己的内部状态,根据需要进行修改以提供受保护的访问.
我已经看到了许多使用两者的例子:Rx和node.js(CPS,不是真正的延续monad)与F#的MailboxProcessor和Scala的Akka框架.我只是不知道为什么你会选择一个而不是另一个.
小智 0
我将回答我自己的问题并说你应该同时使用两者。这是基于Don Syme 的帖子。MbP 使用异步计算来完成其工作,并且异步是线程感知的延续 monad。看起来您可以单独使用它来实现某些用途,但 MbP 绝对需要它。
我不太喜欢这个答案,我很高兴有人能更好地解释何时使用每个答案。
更新:
请参阅MiniRx,它现在是FSharpx的一部分,了解使用MailboxProcessor
. 由于MailboxProcessor
它本身是使用async
monad 实现的,因此它们确实可以一起工作。它们只是不同的抽象方式。