Concurrent Haskell で遊ぶ

勉強してたら知恵熱がでそうになったので休憩。普通のクイックソートより遅くなる。(当たり前)

import Control.Concurrent
import System.Random (randomRs, mkStdGen)

main = do r <- newEmptyMVar
          sort r $ list 1000
          takeMVar r >>= print

list x = take x $ randomRs (0,100) (mkStdGen 0)

sort m []     = putMVar m []
sort m (x:xs) = do let small = [a|a<-xs, a<x]
                   let large = [a|a<-xs, a>=x]
                   a <- newEmptyMVar
                   b <- newEmptyMVar
                   forkOS $ sort a small
                   forkOS $ sort b large
                   a' <- takeMVar a
                   b' <- takeMVar b
                   putMVar m $ a' ++ [x] ++ b'