Handling tabular data
If you need O(1) general indexing, a table-like data structure is virtually your only option. The Haskell report specifies the array
package, which provides tables indexed by anything with an instance for a Ix
typeclass.
Immutable arrays come in two flavors (we'll discuss mutable arrays later):
Data.Array.Array
: Immutable arrays of boxed valuesData.Array.Unboxed.UArray
: Immutable arrays of unboxed values
A common use case for Immutable arrays is memoization. For example, a table of Fibonacci numbers could be constructed as follows:
-- file: fib-array-mem.hs import Data.Array fib :: Int -> Array Int Integer fib n = arr where arr = listArray (1,n) $ 1 : 1 : [ arr!(i-2) + arr!(i-1)| i <- [3..n] ]
We can also index by a tuple, which gives the array extra dimensions. The symmetric Pascal matrix will serve as an example:
pascal :: Int -> Array (Int, Int) Integer pascal n = arr where arr = array ((1,1),(n,n)) $ [ ((i,1),1) | i <- [1..n] ] ++ [ ((1...