[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