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
[EMAIL PROTECTED] wrote:
Message: 7 Date: Mon, 17 Jan 2005 14:21:00 -0600 From: "jekwtw" <[EMAIL PROTECTED]> Subject: Re: Timing Functions To: <glasgow-haskell-users@haskell.org> Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset="iso-8859-1"
Many thanks to both Georg and Lemmih. Actually, I had considered laziness, but I didn't pursue it enough. I tried one version of runNReps in which I passed (f x) as an additional arg; when that didn't work, a little thought convinced me that laziness was doing me in. I also tried another approach, which was to "use" the function evaluation, but that didn't work either (note: I know (f x) can not be the empty list for values of x I'm interested in, but I don't think Haskell does, unless it's *really* smart :-) :
>> 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 [EMAIL PROTECTED]
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users