> > > That said, I don't see a reason for not including a separate version of > runParIO :: ParIO a -> IO a for non-deterministic computations. It seems > really useful! > > Exactly. I should have been more explicit but that's what I meant about "adding another module". You would import Control.Monad.Par.IO and get runParIO + liftIO but NOT runPar. This requires doing a newtype over Par to create the liftIO instance for one and not the other (and preserve Safe Haskell). It's a pain but it's no problem. Both types Control.Monad.Par.Par and Control.Monad.Par.IO.ParIO will expose the same interface (i.e. have instances of the same classes -- ParFuture, ParIVar...), so generic algorithms like "parMap" will still work for either.
-Ryan > Regards, > - Clark > > On Wed, Oct 3, 2012 at 10:24 AM, Ryan Newton <[email protected]> wrote: > >> Several of the monad-par schedulers COULD provide a MonadIO instance and >> thus "liftIO", which would make them easy to use for this kind of parallel >> IO business: >> >> >> http://hackage.haskell.org/packages/archive/monad-par/0.3/doc/html/Control-Monad-Par-Scheds-Direct.html >> >> And that would be a little more scalable because you wouldn't get a >> separate IO thread for each parallel computation. But, to be safe-haskell >> compliant, we don't currently expose IO capabilities. I can add another >> module that exposes this capability if you are interested... >> >> -Ryan >> >> On Fri, Sep 28, 2012 at 4:48 PM, Alexander Solla <[email protected]>wrote: >> >>> >>> >>> On Fri, Sep 28, 2012 at 11:01 AM, Greg Fitzgerald <[email protected]>wrote: >>>> >>>> >>>> I also tried Control.Parallel.Strategies [2]. While that route works, >>>> I had to use unsafePerformIO. Considering that IO is for sequencing >>>> effects and my IO operation doesn't cause any side-effects (besides >>>> hogging a file handle), is this a proper use of unsafePerformIO? >>>> >>> >>> That's actually a perfectly fine use for unsafePerformIO, since the IO >>> action you are performing is pure and therefore safe (modulo your file >>> handle stuff). >>> >>> unsafePerformIO is a problem when the IO action being run has side >>> effects and their order of evaluation matters (since unsafePerformIO will >>> cause them to be run in an "unpredictable" order) >>> >>> One common use for unsafePerformIO is to run a query against an external >>> library. It has to be done in the IO monad, but it is a "pure" computation >>> insofar as it has no side-effects that matter. Doing this lets us promote >>> values defined in external libraries to bona fide pure Haskell values. >>> >>> _______________________________________________ >>> Haskell-Cafe mailing list >>> [email protected] >>> http://www.haskell.org/mailman/listinfo/haskell-cafe >>> >>> >> >> _______________________________________________ >> Haskell-Cafe mailing list >> [email protected] >> http://www.haskell.org/mailman/listinfo/haskell-cafe >> >> >
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
