
I trying to learn a bit about data parallel haskell, and started from the wiki page here:http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell. Two questions:
The examples express the dot product as:
dotp_double xs ys = sumP [:x * http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:. y | x <- xs | y <- ys:]
Unless I'm missing something, shouldn't this actually be:
dotp_double xs ys = sumP [:x * http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:. y | x <- xs, y <- ys:]
No, array comprehension desugaring works the same way as for list comprehension. So this correct: dotp_double xs ys = sumP [:x * y | x <- xs | y <- ys:] After desugaring this will be translated into (simplified): dotp_double xs ys = sumP (zipWithP (*) xs ys) which will multiply the arrays element wise and sum the result. The other definition dotp_double xs ys = sumP [:x * y | x <- xs, y <- ys:] will be translated into (something equivalent): dotp_double xs ys = sumP (concatMapP (\x -> mapP (\y -> x * y)) xs ys) which definitely is not the dot product.