Strictness of enumFrom* on numeric types.

Dan Doel dan.doel at gmail.com
Fri Jul 25 19:06:46 EDT 2008


Greetings,

As happens periodically, someone in #haskell brought up the following code 
snippet:

    [1..] !! 1000000 :: Integer

When evaluated, that causes a stack overflow, because enumFrom currently 
returns a list of increasingly nested thunks for Integers (and Floats and 
Doubles...).

The ensuing discussion, however, brought something I hadn't seen before to 
light: this shouldn't (I think) be the case, per the Haskell 98 report. In 
the section "Predefined Types and Classes", it is specified:

    For all four of these Prelude numeric types, all of the enumFrom
    family of functions are strict in all their arguments.

Which would, I believe, have the side effect of making a straightforward 
implementation of the functions element-strict, thus preventing the stack 
overflows (to confuse matters, the later reference implementation of the 
functions for Floats and Doubles in instead non-strict, but that can probably 
be looked at as a bug in the report).

Currently, I believe only Int (of the four listed in the report) has a proper 
implementation for all the functions. For instance

    length (take 3 (enumFrom undefined))

is undefined for Ints, but is 3 for Integers, Floats and Doubles, so that at 
least is a bug. enumFrom*To are, of course, correct by necessity.

Anyhow, given the above text in the report, it seems reasonable to me to make 
the functions stricter for the above types (and any Ints and Words of various 
lengths if they have similar problems). There is, in fact a trac ticket for 
that:

   http://hackage.haskell.org/trac/ghc/ticket/1997

and a patch, evidently. But dons thought it would be appropriate to alert this 
list, as well (it is the maintainer, after all).

Thanks for your time,
-- Dan Doel


More information about the Libraries mailing list