The type constructor for lists in the Haskell Prelude is []
. The type declaration for a list holding values of type Int
is written as follows:
xs :: [Int] -- or equivalently, but less conveniently,
xs :: [] Int
Lists in Haskell are homogeneous sequences, which is to say that all elements must be of the same type. Unlike tuples, list type is not affected by length:
[1,2,3] :: [Int]
[1,2,3,4] :: [Int]
Lists are constructed using two constructors:
[]
constructs an empty list.
(:)
, pronounced "cons", prepends elements to a list. Consing x
(a value of type a
) onto xs
(a list of values of the same type a
) creates a new list, whose head (the first element) is x
, and tail (the rest of the elements) is xs
.
We can define simple lists as follows:
ys :: [a]
ys = []
xs :: [Int]
xs = 12 : (99 : (37 : []))
-- or = 12 : 99 : 37 : [] -- ((:) is right-associative)
-- or = [12, 99, 37] -- (syntactic sugar for lists)
Note that (++)
, which can be used to build lists is defined recursively in terms of (:)
and []
.