【发布时间】:2011-04-05 14:47:20
【问题描述】:
我一直在尝试找到任何讨论何时应该优先使用 monad 而不是 actor(在并发场景中),但我什么也没找到。特别是,我想知道反应式扩展(LINQ to Events)与 F# 的 MailboxProcessor 的使用。除了您可能拥有的任何哲学推理之外,请提供示例。
更新 为了更好的上下文,响应式扩展以 IObservable/IObserver 的形式实现了 continuation monad。我不一定说我必须使用 F#,只是说 F# 有一个具体的“演员模型”,可以在 .NET 语言中以 MailboxProcessor 的形式使用。
我想了解的是何时使用 monad(在本例中为 continuation monad)与用于并发目的的 Actor 模型。在 monad(据我所知)不引入状态的地方,actor 有自己的内部状态,可以根据需要进行修改以提供受保护的访问。
我见过很多同时使用的例子:Rx 和 node.js(CPS,不是真正的 continuation monad)与 F# 的 MailboxProcessor 和 Scala 的 Akka 框架。我只是不知道你为什么会选择一个而不是另一个。
【问题讨论】:
-
这可能对你完全没用,因为我不知道 f# 也不太明白你的问题来自哪里,但我在 haskell 中编写了一个使用 monad 的actor模型实现堆栈(actor 计算是 Reader/IO monad):hackage.haskell.org/packages/archive/simple-actors/0.1.0/doc/…
-
Phil Trelford 还创建了Rx using actors 的实现,因此根据您的操作,您可以使用 monad 或使用 actor 的 monad 来实现 actor。
-
另一篇“可能对你没有任何用处”的文章。我曾经有人指出,Rx 的主要目的不是引入并发,而是解决它。虽然人们可能认为 F# 代理是一种引入并发性的适当方式。
标签: concurrency f# actor monads system.reactive