2017-04-04 8 views
1

ハスケルの新機能です。最近、私はHaskellによってゲームを作りようとしていました。そのゲームでは、複数のスレッドを作成するためにConcurrentを使用します。Haskellでシェア変数を作成するには?

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++(static double xxx)のような変数を定義して、どの関数でも参照できますか?

+1

ここで「共有変数」とはどういう意味なのか、どのように使用するのかを示すC++コードを教えてください。 – leftaroundabout

答えて

1

通常、このような変数はmain、または別のIOアクションで作成されます。

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

は、「グローバル変数」(主にIORef sおよびMVar秒)を宣言するためにいくつかの方法がありますが、それらは、特に初心者で、危険な機能を伴い、そして避けることが最善です。このようなグローバル変数はほとんど不必要なので、より多くの型を必要とする場合でも、いくつかの引数を渡すほうがよい場合がよくあります。

さらに高度なコードでは、ReaderT r IOモナドを使用して、コードの冗長性を減らし、単純にMVarを渡します。しかし、冒頭では、変数を渡しても問題ありません。

+0

これは機能し、探している共有状態を提供しますが、実際に複数のスレッドが必要ない場合は、まったく反パターンです。私は、よりクリーンでより慣用的なコードを生成するので、OPはFPパターンに適応する必要があると思います。 'StateT GameState'などを使ってMVarsを渡し、コードベース全体を' IO'で汚染するよりもずっと優れています。 [非常に関連性の高い以前の質問](http://stackoverflow.com/questions/43215607/why-this-haskell-code-cannot-be-コンパイル済み) – Lazersmoke

関連する問題