Control.Concurrentを使うとHaskellでもマルチスレッド処理ができます。 よく使う函数は(多分)以下の通り。 forkIO :: IO () -> IO ThreadId -- IO ()を渡すとその場で実行 killThread :: ThreadId -> IO () -- 指定のThreadをkillする threadDelay :: Int -> IO () -- スレッドを指定の時間[microsec]だけ停止する data MVar a -- スレッド内で使えるmutableな変数 newMVar :: a -> IO (MVar a) -- 変数を初期化 takeMVar :: MVar a -> IO a -- 変数の値を取り出す putMVar :: MVar a -> a -> IO () -- 変数に代入する import Control.Conc
![Haskellでマルチスレッド処理 - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/ac7628b2ff39fc5592fc133013aef5d79edfb98b/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9SGFza2VsbCVFMyU4MSVBNyVFMyU4MyU5RSVFMyU4MyVBQiVFMyU4MyU4MSVFMyU4MiVCOSVFMyU4MyVBQyVFMyU4MyU4MyVFMyU4MyU4OSVFNSU4NyVBNiVFNyU5MCU4NiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MzFjNjE2ZmI3NTc2ZGVkMTMxYjI3ZmU4MGU3MDdiNzY%26mark-x%3D142%26mark-y%3D112%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwbXl1b25fbXlvbiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NjRlZGE0YTNlMTA2MWMwMmIyYjAzYTliMjg4ZGI0NmI%26blend-x%3D142%26blend-y%3D491%26blend-mode%3Dnormal%26s%3Dfbbc681cfda1af0fd1fa3fe535f46577)