【Haskell】unsafeInterleaveIO

2007-08-18

純粋関数型雑記帳 - 超前衛的ゲームプログラミング方法論Ⅱを見て、unsafeInterleaveIOを試してみようと思い次のようなソースを書いた:

import System.IO.Unsafe    -- unsafeInterleaveIO :: IO a -> IO a
import Control.Concurrent -- threadDelay :: Int -> IO ()

delay = threadDelay . (* 1000) -- theadDelay の引数は マイクロ秒

delayList :: (Num a) => a -> IO [a]
delayList n = unsafeInterleaveIO $ do
delay 1000
ns <- delayList (n+1)
return $ n:ns

main = delayList 0 >>= return . take 20 >>= mapM_ print

実行すると1秒ごとに数値が表示されていく。よしよし。