2014-02-07 94 views
1

我想在Haskell中对生物系统建模。我正在考虑如下。Haskell中的并发(或并行)实体(或类似实体的对象)

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

在Haskell中推荐的方法是什么?我很了解基本的Haskell。我也很喜欢Monad和Arrows。当我阅读反应性香蕉图书馆时,我可以掌握很多东西。

+0

首先,“平行”和“并发”的含义略有不同,请选择一个。您提到“每个函数计算时间...”目前尚不清楚此函数计算什么。另外我认为向我们提供信息对于您的模型的目标是多么可靠是非常重要的。你打算获得一些可靠的科学信息,或只是做一些乐趣?你似乎描述了你的手段,而不是目标。 – user3974391

+2

P.S.当我听到单词“对象”,“读写全局变量”等时,我总是开始疑惑为什么提问者会选择纯粹的功能语言。是的,可以在Haskell中模拟所有这些事情,但这不是一种自然的使用方法。为此选择其他语言肯定会更方便。 – user3974391

+0

@ user2894391更新了问题。 – Dilawar

回答

2

你描述的东西似乎是the actors model。这是Erlang编程语言的面包和黄油,但Haskell没有内置演员原语。 Quick Cabal检测提供hactorssimple-actors,但我无法详细说明细节。

+1

[Hackage支持立即搜索](http://hackage.haskell.org/packages/search?terms=actors)。 –

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。使用recv

send :: Output a -> a -> STM Bool 

...和接收个人信息:你可以使用send发送一次单个消息

recv :: Input a -> STM (Maybe a) 

它配备了一个extended tutorial解释如何使用图书馆。