2014-02-07 2 views
1

Я хочу моделировать биологическую систему в Haskell. Я собираюсь сделать это следующим образом.Параллельные (или параллельные) объекты (или объекты, подобные объектам) в Haskell

  • Каждая ячейка является сущностью; как объект в объектно-ориентированном программировании. Этот объект может читать глобальные переменные и обновлять их. Каждый объект может иметь более одной функции. Каждая функция вычисляет что-то, когда некоторые глобальные переменные достигают определенных значений. В зависимости от результата вычисления каждая функция обновляет некоторую глобальную переменную. Что-то вроде языка описания аппаратных средств, такого как VHDL, Bluespec и Verilog.

Каков рекомендуемый способ сделать это в Haskell. Я хорошо знаю базовый Хаскелл. Мне также нравится Монада и Стрелы. Я мог многое понять, когда читал реактивную библиотеку бананов.

+0

Во-первых, слова «parallel» и «concurrent» имеют немного другое значение, поэтому выберите один, пожалуйста. Вы упомянули «Каждая функция вычисляет, когда ...» Неясно, что вычисляет эта функция. Также я думаю, что важно предоставить нам информацию о том, насколько надежна ваша модель. Планируете ли вы получить достоверную научную информацию или просто повеселитесь? Кажется, вы описали свои средства, а не цели. – user3974391

+2

P.S. Когда я слышу слова «объекты», «читаю и пишу глобальные переменные» и т. Д., Я всегда начинаю задаваться вопросом, почему вопросик выбирает чистый функциональный язык.Да, в Хэкелле можно подражать всем этим, но это не естественный способ использовать его. Для этого, конечно, будет удобнее выбирать для этого какой-то другой язык. – user3974391

+0

@ user2894391 Обновлен вопрос. – Dilawar

ответ

2

То, что вы описали, похоже, the actors model. Это хлеб и масло языка программирования Эрланг, но у Haskell нет встроенных актеров-примитивов. Проверка Quick Cabal дает hactors и simple-actors, но я не могу подробно остановиться на деталях.

+1

[Hackage поддерживает поиск сейчас] (http://hackage.haskell.org/packages/search?terms=actors). –

1

Если вы хотите систему актеров в Haskell, я бы настоятельно предложил посмотреть на Cloud Haskell. Он основан на Erlang/OTP (предлагая одно и то же сообщение, передающее семантику параллелизма и обработку отказа).

Предостережения: Я - сопровождающий. ;)

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

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, объясняющие, как использовать библиотеку.

Смежные вопросы