11

Bir monadik fonksiyonum var getRate:ParMap'i monadik bir işlevle nasıl kullanabilirim?

getRate :: String -> IO Double 

Bu işlevi String'lerin bir listesi üzerinde eşlemek istiyorum. Normalde,

mapM getRate ["foo", "bar"] 
). Xzx27
parMapM getRate ["foo", "bar"] 

gibi bir şey düşünüyorum ama parMapM fonksiyonu yok ve parMap monadik fonksiyonlarla çalışmaz.

Ne yapabilirim?

cevap

6

gibi bir şey: Bunun

fork1 :: (a -> IO b) -> a -> IO (MVar b) 
fork1 f x = 
    do 
    cell <- newEmptyMVar 
    forkIO (do { result <- f x; putMVar cell result }) 
    return cell 

fork :: (a -> IO b) -> [a] -> IO [MVar b] 
fork f = mapM (fork1 f) 

join :: [MVar b] -> IO [b] 
join = mapM takeMVar 

forkJoin :: (a -> IO b) -> [a] -> IO [b] 
forkJoin f xs = (fork f xs) >>= join 

Parçaları (çatal, katılmak) sıralı bak. Pratikte ne oluyor, iplikler sırayla çatalla ateşleniyor ve sırayla her ipliği bekleyerek buluşuyor. Ancak IO aynı anda gerçekleşir.

Yabancı işlevleri çağırmanız gerekirse, forkIO yerine forkOS kullanmanız gerektiğini unutmayın.

+0

Bu mükemmel - teşekkürler! – Bill

İlgili konular