
Thanks - I was aware of par and it's ilk, but I couldn't imagine any way of doing the latter... how can you actually force something pure to get calculated in a worker thread? But thinking now, I guess judicious use of seq or deepseq is appropriate. Something like this might work. workerThread :: (a->b) -> MVar a -> MVar b -> IO () workerThread f inp out = do a <- takeMVar inp let b = f a in (b `seq` putMVar out b) workerThread f inp out In a spare moment I'll have to give it a go. Tim -----Original Message----- From: Don Stewart [mailto:dons@galois.com] Sent: Tuesday, 6 November 2007 11:16 AM To: Tim Docker Cc: haskell-cafe@haskell.org; Bulat Ziganshin Subject: Re: [Haskell-cafe] Go parallel timd:
Is it possible to use the forkIO primitive to cause pure computations to be evaluated in parallel threads?
It seems to me that laziness would always prevent any evaluation until
the result was used in a consuming thread (and hence would occur serially, in that thread).
Try `par` and friends in Control.Parallel. You can also build referentially transparent worker gangs on top of forkIO. -- Don