Haskell中的并发(或并行)实体(或类似实体的对象)

时间:2014-02-07 12:52:00

标签: haskell concurrency simulator

我想在Haskell中建模一个生物系统。我想这样做。

  • 每个细胞都是一个实体;像面向对象编程中的对象。该实体可以读取全局变量并更新它们。每个实体可以有多个功能。当某些全局变量达到某个值时,每个函数都会计根据计算结果,每个函数然后更新一些全局变量。像硬件描述语言,如VHDL,Bluespec和Verilog。

在Haskell中推荐的方法是什么?我非常了解基本的Haskell。 Monad和Arrows也很舒服。当我阅读反应性香蕉库时,我可以掌握很多。

3 个答案:

答案 0 :(得分:2)

你描述的东西似乎是the actors model。这是Erlang编程语言的基础,但Haskell没有内置的actor原语。 Quick Cabal检查提供hactorssimple-actors,但我无法详细说明。

答案 1 :(得分:1)

如果您想在Haskell中使用actor系统,我强烈建议您查看Cloud Haskell。它基于Erlang / OTP(提供相同的消息传递并发语义和故障处理)。

警告:我是维护者。 ;)

https://github.com/haskell-distributed http://haskell-distributed.github.io

答案 2 :(得分:1)

这里的其他人都提到过演员,所以我想提及pipes-concurrency,这是一种非分布式的演员。

与演员一样,您可以spawn邮箱:

import Pipes
import Pipes.Concurrent
import qualified Pipes.Prelude

main = do
    (output, input) <- spawn Unbounded
    ...

...向邮箱发送邮件:

    forkIO $ runEffect $ Pipes.Prelude.stdinLn >-> toOutput output

...并从邮箱中读取邮件:

    runEffect $ runEffect $ fromInput input >-> Pipes.Prelude.stdoutLn

您甚至不必使用pipes界面。您可以使用send

一次发送单个邮件
send :: Output a -> a -> STM Bool

...并使用recv

接收个人消息
recv :: Input a -> STM (Maybe a)

附带一个extended tutorial,解释了如何使用该库。