[Haskell-beginners] List operations

Daniel Fischer daniel.is.fischer at googlemail.com
Thu May 19 17:57:05 CEST 2011


On Thursday 19 May 2011 16:05:29, jianqiuchi at gmail.com wrote:
> Hi,
> 
> I have a question about the cost of list comprehension and map function.
> 
> For example, I have a list of Double and I want to do lots of
> calculation on it. There are two ways to do that:
> 1. [x ** 3 | x <- list]
> 2. map (flip (**) 3) list
> I am wondering if the cost of using them could be very different and
> why.

As Felipe said, they should compile to the same code.
However, since you're asking about cost, which indicates that you care for 
performance, the above would be better written as

[x*x*x | x <- list]

unless you depend on the small differences in the outcome [I'm not quite 
sure how many bits may be affected, not many, typically none or one].
Functions like (**), exp, log, sin, cos, ... are slow, very slow.
If the exponent is a small (positive) integer, specifically giving a 
sequence of multiplication steps is much faster, also using (^) instead of 
(**) is faster for small exponents (but slower than an explicit 
multiplication sequence).

Of course, if the exponent may be a non-integer, you have to use (**), if 
it is an integer but not a fixed one, use (**) if the integer may be 
large¹, (^) or (^^) if it is sure to be small (in absolute modulus).

[¹] (**) doesn't care how large the exponent is, (^) resp (^^) do.



More information about the Beginners mailing list