如何在Haskell中创建共享变量?

时间:2017-04-04 20:52:28

标签: haskell

我是Haskell的新手。最近,我试图用Haskell创建一个游戏。在那个游戏中,我使用Concurrent来创建多个线程。

data Msg = C Char | Time

forkIO $ userThread chan
forkIO $ processThread startTimer

userThread :: MVar Msg -> IO ()
userThread chan = forever $ do
  c <- getChar
  putMVar chan (C c)
  showStr(show c)

processThread :: MVar Msg -> IO ()
processThread chan = forever $ do
  threadDelay (startTimer)
  putMVar chan (Time)

我不知道如何定义线程之间共享的任何其他数据。我可以定义一个像C ++(静态双xxx)的变量并被任何函数访问吗?

1 个答案:

答案 0 :(得分:1)

通常,此类变量是在main或其他IO操作中创建的。

main = do
   chan <- newEmptyMVar
   startTimer <- newEmptyMVar
   ...
   forkIO $ userThread chan
   forkIO $ processThread startTimer
   ...

有一些方法可以声明&#34;全局变量&#34; (主要是IORefMVar s),但它们涉及不安全的功能,最好避免使用,特别是初学者。这样的全局变量大多是不必要的,并且通常更好地传递一些参数,即使它需要更多的输入。

在更高级的代码中,可以使用ReaderT r IO monad来减少简单地传递MVar的代码的详细程度。但在开始时,传递变量很好。