Felipe Lessa wrote:
On Thu, Feb 21, 2008 at 8:58 AM, Luke Andrew <[EMAIL PROTECTED]> wrote:
 test2.hs:

    import Control.Parallel

    fib1 n = if n == 0 then 0 else if n == 1 then 1 else fib1 (n-1) +
 fib1 (n-2)
    fib2 n = if n == 0 then 0 else if n == 1 then 1 else fib2 (n-1) +
 fib2 (n-2)
    fiblist1 n = [fib1 x| x <- [1..n]]
    fiblist2 n = [fib2 x| x <- [1..n]]

    main = do print $ zipWith (+) (fiblist2 37 `par` fiblist1 37)
 (fiblist2 37)

Besides what Jules Bean said, note also that 'par' works a bit like
'seq', only evaluating until WHNF. So even if you said

main =
  let f1 = fiblist1 37
      f2 = fiblist2 37
  in print $ zipWith (+) (f2 `par` f1) f2

you still wouldn't get what you want. Why? It only evaluates f1 and f2
until it reaches [] or (_:_), and nothing more, it doesn't even try to
figure out that f2 is _:_:_:_:···:[] nor it tries to see that f2 is
1:_, but you wanted that the parallel computation went until f2 was
1:1:2:3:···:[].

To do that, force the list (i.e. do a "deep seq"). There's
Control.Parallel.Strategies to help you doing this, but if you want to
reimplement it, try

force []      = ()
force (x:xs) = x `seq` force xs

main =
  let f1 = fiblist1 37
      f2 = fiblist2 37
  in print $ zipWith (+) (force f2 `par` f1) f2

'par' will try to see that 'force f2' is really (), but to do that
'force' will go all the way down thru the list forcing its spine and
its values.

HTH,

Thanks Felipe, works as advertised. Guest I'm going to have to read up on WHNF, I just ignored it after my initial success & hoped it would continue to work. Guess I should have RTFM :)
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to