Ariel J. Birnbaum valgarv at gmx.net
Thu Apr 10 17:36:08 EDT 2008

```I think you were having a similar problem in an earlier thread.
Others have given answers, but I'll try to drive the point home further.

In a pattern match like this:

f a = case a of
[Rule x y] -> ...

the pattern is *NOT* matched against each element of the list, but against the
list as a whole.
Say we have an expression like:

let f [x] = True
l = [1,2,3]
in f l

In the third line we attempt to match the list [1,2,3] against the pattern
[x]. This cannot possibly work -- [x] can only match a list with a single
element!

I hope it's more clear now -- and that I answered the right question at all!
There's more detail below if you're interested.

{-# nitty-gritty on #-}
In more detail, recall that [x] is nothing but syntactic sugar for x:[]. That
is, the (:) constructor applied to x and []. [1,2,3] in turn stands for
1:2:3:[]. Pattern matching then proceeds:

Match 1:2:3:[] against x:[]
(:) matched -> match 1 against x; 2:3:[] against []

Match 1 against x
x is a variable, bind it to 1

Match 2:3:[] against []
Match failed!
{-# nitty-gritty off #-}

Have fun =)