[Haskell-cafe] Trouble with function with two clauses

gwern0 at gmail.com gwern0 at gmail.com
Wed Jan 9 13:47:33 EST 2008

On 2008.01.09 18:15:33 +0000, Fernando Rodriguez <frr149 at easyjob.net> scribbled 0.3K characters:
> Hi,
> I have the following type and function:
> data ConsCell a = Nil | Cons a (ConsCell a) deriving Show
> head' Nil = Nothing
> head' (Cons a _) = Just a
> Works fine, however, what's wrong with the following function?
> head'' 	| Nil = Nothing
> 	| Cons a _ = Just a
> Thanks!

Couple of things. Your head'' is trying to use pattern-matching, but guards (which are what you are actually using) require a Bool expression on the left hand side; guards just desugar into if-then-else clauses.

In this case it'd look something like

> head'' a = if Nil then Nothing else if Cons a _ then Just a else ???

This doesn't make sense. Nil is just Nil, it's not in Bool; the if can't do anything with that. Similarly, Cons a _ is just ConsCell and in the Show typeclass; it too is not Bool.

If we turn it into pattern-matching:

> head'' Nil = Nothing
> head'' Cons a _ = Just a

But this still doesn't work - one definition takes a single argument, and the other 3; Nil (1), vs [Cons, a, _] (3). So:

head'' Nil = Nothing
head'' (Cons a _) = Just a

Parentheses force the Cons to be seen as a single argument.

So I guess your final product would look like this, which is pretty much what you start out with.

> data ConsCell a = Nil | Cons a (ConsCell a) deriving Show
> head' :: ConsCell a -> Maybe a
> head' Nil = Nothing
> head' (Cons a _) = Just a

Hackers Emerson EO SAS Majic CANSLO rail ABC CFD RSOC
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20080109/f11d1d00/attachment.bin

More information about the Haskell-Cafe mailing list