Как запускать вызовы SAT параллельно, используя привязки picosat haskell?

import Picosat
import Control.Applicative

main :: IO ()
main = do
  dimacsList1 <- (read <$> getLine) :: IO [[Integer]]
  dimacsList2 <- (read <$> getLine) :: IO [[Integer]]

  res1 <- solve dimacsList1
  res2 <- solve dimacsList2

  putStrLn $ (show res1) ++ "  " ++ (show res2)

Вопрос. Как изменить приведенный выше пример, чтобы два спутниковых вызова выполнялись параллельно, т. е. с использованием параллелизма? Меня интересует производительность, если есть разные варианты.

(Просто для проверки: насколько я понимаю, монада ST ортогональна и не может использоваться в сочетании с параллелизацией/параллелизмом. Монада ST вначале меня немного смутила, это одна из причин, по которой я задаю вопрос.)


person mrsteve    schedule 25.05.2014    source источник
comment
ST это IO с допустимыми эффектами, ограниченными мутацией переменных, созданных в рамках этого ST сеанса. Если есть какой-либо эффект, отличный от мутации, например параллелизм, это не то место, где можно использовать ST.   -  person Carl    schedule 25.05.2014
comment
Вы можете просмотреть новую замечательную книгу Саймона Марлоу   -  person jberryman    schedule 25.05.2014


Ответы (1)


Самый простой способ — использовать библиотеку async. Что-то вроде этого, может быть.

[res1, res2] <- mapConcurrently solve [dimacsList1, dimacsList2]
person Carl    schedule 25.05.2014