[Haskell-cafe] Shorthand method of enumerating a list a gotcha
... or is it just me?
Malcolm Wallace
malcolm.wallace at cs.york.ac.uk
Sat May 8 03:47:39 EDT 2010
>> Hugs> [3,7..22]
>> [3,7,11,15,19] <- OK
>>
>> Hugs> map (* 1.0) [3,7..22] <- same spec as first but !!! when
>> mapped to with a
>> (*1.0) to coerce
>> them to reals:
>> [3.0,7.0,11.0,15.0,19.0,23.0] <- went one outside of range spec.
>
> This is because the Enum instance for floating point numbers is screwy
> and shouldn't be used in general
I think the original poster is probably being confused by the fact
that the first mention of [3,7..22] looks identical to the second
mention, but they are given different types by Haskell. The literal
'3', although it looks like an integer, is being given the type Double
in the second list enumeration, because of the context of needing to
multiply it by 1.0. The comment mentions coercion, as if the list is
generated at type Integer, and then converted to Double, but that is
not the case. It is generated at type Double, and no coercion happens.
Regards,
Malcolm
More information about the Haskell-Cafe
mailing list