If you consider the type of the operator *(:)* you have: Prelude> :t (:) (:) :: a -> [a] -> [a] So it takes an element of type a and a list. So if you write 1:[2,3,4] the type is correct, because you give an integer 1 and a list of integers [2,3,4]. You will obtain the list of integers [1,2,3,4]. Similarly, writing 1:[] is correct and gives you [1] as result. Then, if you write 0 : 1 : [] (as in your example), is the same as 0 : (1 : []) so it means 0 : [1], which is [0,1]. So, the operator (:) is right associative. If it was left associative, your example would give an error. Indeed (0 : 1) : [] is not correct in Haskell. Furthermore, your final examples are both false: Prelude> [] == [] : [] False [[], []] == [] : [] False The following is True: Prelude> [[]] == [] : [] True Indeed if you write [] : [] youy mean you want to build a list whose first element (head) is [] and whose "tail" (i.e. the rest of the list) is the empty list. So, if 1:[] is [1], then []:[] is [[]]. Ut 2018-08-18 11:13 GMT+02:00 trent shipley <trent.shipley@gmail.com>:
Why does Haskell so often seem to treat [] as a general null.
For example I know 0 : 1 : [] gives [0, 1].
But shouldn't it produce a type fault in a consistent world?
Int:Int:List isn't properly a list. It mixes types.
I expect something like:
Let GSN mean general_scalar_null.
1 : 2 : GSN -- works
1 : 2 : [] -- type fault, cannot mix int and empty list in the same list.
And why does [] == [] : [] instead of [[], []] == [] : []
What sorts of nullity are there in core Haskell?
Trent.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners