バックグラウンドで実行したアクションの結果を受けとる
Java の Future みたいなものを Haskell で。
import Control.Concurrent (forkIO, newChan, writeChan, readChan) type Future a = IO a onBackground :: IO a -> IO (Future a) onBackground act = do ch <- newChan forkIO (act' ch) return (readChan ch) where act' ch = act >>= writeChan ch
疑似コードでの使用例。
-- HTML のレンダリング。画像のダウンロードをバックグラウンドで -- 実行し, テキストのレンダリングを行う. テキストのレンダリング -- が終わったら, 画像ダウンロードの結果を待つ. 画像のダウンロー -- ドが完了したら, テキストと合わせる. renderHtml = do dlTask <- onBackground downloadImages text <- renderText imgs <- dlTask merge text imgs