Monads和演员
我一直在试图找到讨论什么时候应该赞成使用monad而不是actor(在并发场景中)的东西,但是我什么也没有发现。 特别是,我想知道使用Reactive Extensions(LINQ to Events)与F#的MailboxProcessor。 除了你可能有的任何哲学推理之外,请举例。
更新为了获得更好的上下文,Reactive Extensions以IObservable / IObserver的形式实现继续monad。 我不一定说我必须使用F#,只是F#在MailboxProcessor <'T>形式的.NET语言中提供了一个具体的“actor模型”。
我试图理解的是何时使用monad(在本例中是延续monad)与演员模型之间的并发目的。 在monad(据我所知)没有引入状态的情况下,演员有自己的内部状态,根据需要进行修改以提供受保护的访问。
我已经看到了许多使用两者的例子:Rx和node.js(CPS,并非真正的延续monad)与F#的MailboxProcessor和Scala的Akka框架。 我只是不知道为什么你会选择一个。
我不确定这个问题在措辞上是否有意义 - 有许多不同的monad(例如,身份monad,列表monad,选项monad,...),其中大部分与并发无关。 此外,了解更多关于您正在处理的特定场景的信息会很有帮助 - “并发性”有点含糊不清。 根据你想要达到的目标,F#的async
工作流程(建立在Async
单元上)可能是你最好的选择。
如果您使用F#,我建议不要直接使用LINQ到任何东西,因为这些库在通过F#访问时具有非常异乎寻常的感觉。 但是,您可以创建令人愉快的F#包装(例如现有的Seq
和Observable
模块)。 此外,对于一元类型,您可以创建一个计算表达式构建器(例如,您可以使用Reactive Extensions创建一个构建器,这将使您能够使用计算表达式来构建和组合IObservable
)。
因为我刚刚学习F#,请原谅我的新手。
如果您有任何相关材料的链接,我很想看看使用RX代替MailboxProcessor。
我的理解有限; 我会在自己的代码中选择MbP,因为在F#中设置事件有点麻烦(从我可以从这篇文章中得到的内容:MSDN)。 你需要RX的事件来钩入正确的?
与MbP一样,我需要的只是消息的区分组合,这是我希望在收到给定消息时执行的功能列表。 和处理这个问题的邮箱处理器。
这一切在代码中看起来很整齐。 我可以将我的MbP集中在一个模块中,然后我的“对象”模块看起来像
对我来说,这看起来比它更好看,如果我用我链接到的MSDN文章中描述的事件编写我的代码。
虽然我只是一名F#大三学生,所以我可能会因为我的计算而离开一英里,这是一种外观和感觉的事情,而不是一种适合目的的选择(因为我还没有资格打这个电话)
我会回应我自己的问题,并说你应该同时使用两者。 这是基于Don Syme的帖子。 MbP使用Async计算来完成它的工作,而Async是一个线程感知延续monad。 看起来你可以自己使用它的一些用途,但MbP肯定需要它。
我不太喜欢这个答案,我会很高兴有人能够更好地解释何时使用它们。
更新:
请参阅现在除FSharpx之外的MiniRx,以实现使用MailboxProcessor
实现的Rx样式monad。 由于MailboxProcessor
本身是使用async
monad实现的,所以这些拼凑起来确实可以一起工作。 它们只是不同的抽象手段。
上一篇: Monads and Actors
下一篇: Unboxing uint/int without knowing what's inside the box