バックグラウンドで実行したアクションの結果を受けとる

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

Unix シェル的なバックグラウンドでのタスク処理 - (new Hatena).blog() に触発された。