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
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