私はHaskellで並行性を使用して、2つの値の1つだけが必要な特定の最適化を試みています。状況によっては、どちらか一方の方がもう一方よりもはるかに高速に作成できる場合があります。
forkIOで2つのスレッドを実行し、値がMVarに配置されるまで待つことができると思いました。これは私がこれのために書いた簡単なテストです:
import Control.Concurrent
main = do out <- newEmptyMVar
t1 <- forkIO (makeString out)
t2 <- forkIO (makeInt out)
v <- takeMVar out
killThread t1
killThread t2
case v of
Left s -> putStrLn s
Right i -> putStrLn $ show i
makeString out = do s <- return ( show (primes !! 10000))
putMVar out $ Left s
makeInt out = do i <- return 2
putMVar out $ Right i
primes = sieve [2..]
where sieve (x:xs) = x : (sieve $ filter ((/=0).(flip mod x)) xs)
コンパイル済み:
ghc --make -threaded Test
ただし、プライムの取得にはmakeIntスレッドが開始するのに十分な時間がかかるはずですが、Leftの場合にのみ到達します(2を返すのにそれほど時間はかからないはずです)。それはなぜですか、そしてどうすればこれを修正できますか?