[Haskell] whereis the lazyness ?

Duncan Coutts duncan.coutts at worc.ox.ac.uk
Fri Dec 3 14:22:29 EST 2004


On Fri, 2004-12-03 at 13:21 +0100, Fred Nicolier wrote: 
> I'am a little bit confused by the following error messages :
> 
> \begin{code}
> import Array
> type SignalOf = Array Int
> 
> funcSignal :: (Num a, Num b) => (Int, Int) -> (a -> b) -> SignalOf b
> funcSignal b f = listArray b [f (fromIntegral k) | k <- range b]
> 
> instance (Num a) => Num (SignalOf a) where
>     fromInteger k = funcSignal (minB, maxB) (const i)
>         where minB = (minBound :: Int) + 1
>               maxB = (maxBound :: Int) - 1
>               i = fromInteger k
> \end{code}
> 
> When testing on ghci -> 
> *Main> let x = 1::SignalOf Int
> Loading package haskell98 ... linking ... done.
> *Main> bounds x
> zsh: segmentation fault (core dumped)  ghci infArray.hs
> 
> Is it not possible to define a really huge array ?

No. The array really does get created with that huge number elements.
The Haskell Array type is lazy in it's *elements*, not its keys.

The underlying implementation something like a C array of pointers to
(not necessarily yet evaluated) values.

The Array type is just your ordinary O(1) indexable structure. If you
want a data structure that works well with sparse keys, you'll need to
look beyond the simple Array type. FiniteMap would work fine for this. 

I can't immediately think of a collection data structure combining O(1)
lookup with a sparse key space however - that sounds quite tricky.

Duncan



More information about the Haskell mailing list