[Haskell-cafe] Shorthand method of enumerating a list a gotcha ... or is it just me?

Ivan Lazar Miljenovic ivan.miljenovic at gmail.com
Fri May 7 18:19:23 EDT 2010


Gene A <yumagene at gmail.com> writes:

> The problem I see is that in both:
>  Version: September 2006 of hugs, which is the one that is current for
> Ubuntu 9.10 release, and
> ghci 6.10.4, they both exhibit a {I think} strange behaviour, in regards
> to the shorthand way of calling out a list of enumerable values.  I will
> explain the problem that I have run into with examples:
>
> Hugs> [3,7..22]
> [3,7,11,15,19]     <- OK
>
> Hugs> map (* 1.0) [3,7,11,15,19]  <- manual spec OK
> [3.0,7.0,11.0,15.0,19.0]
>
> 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.
>
> [snip]
>
> This seems like a possible bug? or at least a sure fire trap waiting to
> be sprung ... one of those nasties that could really create havoc if
> someone is not aware of this behaviour and buries a function that include
> something that unwittingly coerces from an Integral to a Realfrac or
> Fractional.  Is this a well known thing to watch out for..
> or is it something that can be worked around, other then having to
> enumerate every value in a list rather then use the handiness of
> the range notation as shorthand?

This is because the Enum instance for floating point numbers is screwy
and shouldn't be used in general (floating point rounding, etc.; don't
forget, they're defined in binary and not all fractional values can be
defined exactly in a finite binary value).  A better way:

map fromIntegral [3,7..22]

-- 
Ivan Lazar Miljenovic
Ivan.Miljenovic at gmail.com
IvanMiljenovic.wordpress.com


More information about the Haskell-Cafe mailing list