[Haskell-cafe] Pattern match failure
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 =)
Jealous 'cause I never had any homework in Haskell,
--
Ariel J. Birnbaum
More information about the Haskell-Cafe
mailing list