次のプログラムは、同時に実行される 2 つのスレッドを作成し、それぞれがランダムな時間だけスリープしてから、テキスト行を stdout に出力します。
import Control.Concurrent
import Control.Monad
import System.Random
randomDelay t = randomRIO (0, t) >>= threadDelay
printer str = forkIO . forever $ do
randomDelay 1000000 -- μs
putStrLn str
main = do
printer "Hello"
printer "World"
return ()
出力は一般的に次のようになります
>> main
Hello
World
World
Hello
WoHrelld
o
World
Hello
*Interrupted
>>
一度に 1 つのスレッドだけが stdout に書き込めるようにするにはどうすればよいでしょうか? これは STM が得意とする種類のことのように思えますが、すべての STM トランザクションSTM a
には一部の型が必要a
であり、画面に出力するアクションには型があり、にIO a
埋め込む方法はないようです。IO
STM