
Hi Bill,
In order to force the *complete* evaluation of your result, you
could use Evaluation Strategies. Strategies are a concept
introduced for increasing parallelism in Glasgow parallel Haskell.
Parallelism and lazy evaluation are in a way contrary aims, since you
want your parallel evaluation to start ASAP, even if there is no
actual demand on its result.
Check the following paper for more information:
http://www.macs.hw.ac.uk/~dsg/gph/papers/html/Strategies/strategies.html
A strategy module should be included in the libraries in GHC...
Formerly just module "Strategies" in package concurrent,
now in package base, module "Control.Parallel.Strategies"
Concretely, I suggest to apply the strategy "rnf" (reduce to normal form)
to "junk" instead of just checking the first node in the graph.
What null does is to look at the list and yields true if the top constructor is
"[]" and not "(:)".
Your version below is what you get with just "junk `seq` runNReps f x (todo-1)"
- weak head normal form evaluation.
runNReps f x todo | todo > 0 = do let junk = f x
rnf junk `seq` runNReps f x (todo-1)
HTH
Jost
glasgow-haskell-users-request@haskell.org wrote:
Message: 7 Date: Mon, 17 Jan 2005 14:21:00 -0600
From: "jekwtw"
runNReps :: (Int -> [a]) -> Int -> Int -> IO () runNReps f x todo | todo > 0 = do let junk = (f x) if null junk then return (()) else runNReps f x (todo - 1) | otherwise = return (())
Ideas? Again, many thanks, -- Bill Wood bill.wood@acm.org