Почему эта программа на Haskell действительно параллельная? - PullRequest
0 голосов
/ 25 января 2019

Я узнаю о простых способах использования forkIO и Mvar из книги Марлоу: Параллельное и параллельное программирование в Haskell .В разделе MVar в качестве контейнера для общего состояния предоставляется следующий код:

-- Creates a new Map within an MVar
new :: IO PhoneBookState
new = do
  m <- newMVar Map.empty
  return (PhoneBookState m)

-- Inserts a Key, Value in the Map, locking the MVar
insert :: PhoneBookState -> Name -> PhoneNumber -> IO ()
insert (PhoneBookState m) name number = do
  book <- takeMVar m
  putMVar m (Map.insert name number book)

-- Retrieves the Map, locking the MVar briefly
lookup :: PhoneBookState -> Name -> IO (Maybe PhoneNumber)
lookup (PhoneBookState m) name = do
  book <- takeMVar m
  putMVar m book
  return (Map.lookup name book)

Где PhoneBookState содержит MVar (Map Name PhoneNumber).Моя проблема заключается в функции main

main = do
  s <- new
  sequence_ [ insert s ("name" ++ show n) (show n) | n <- [1..10000] ]
  lookup s "name999" >>= print
  lookup s "unknown" >>= print

Идея состоит в том, что оба поиска происходят одновременно, но в таком случае, не должно ли это быть что-то вроде

main = do
  s <- new
  sequence_ [ insert s ("name" ++ show n) (show n) | n <- [1..10000] ]
  forkIO(lookup s "name999" >>= print)
  lookup s "unknown" >>= print

Что такоеЯ скучаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...