2014-02-07 54 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解釋如何使用圖書館。