Type of empty list

From HaskellWiki
Revision as of 14:05, 5 January 2012 by Lemming (talk | contribs) (Answer, refer to phantom types)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Question

Why is

([]::[Int]) == ([]::[Char])

a type error and not just True (because both lists are empty) or False (because the types mismatch)?

Related question: Why is

map :: (a -> b) -> [a] -> [b]
map f (x:xs) = f x : map f xs
map f xs@[] = xs

a type error and the case definition

map f [] = []

is not?


Answer

For an empty list it may seem silly to talk about the types of its elements, since it has no elements. However when you prepend new elements to the empty list it is important what elements are allowed. E.g. 2 : ([]::String) makes no sense, right?

Lists can be defined by

data [a] = a : [a] | []

and you see that one of the constructors (the empty list []) does not use the type parameter a. There are types, where none of the constructors refers to the type parameter and these types are very useful, e.g. for defining numbers with type-checked physical dimensions. For details refer to "phantom types".