It has to know the constructor in order to know the type of n. In your case they are both int, but in the general case they could be completely different types and therefore you could not just use the constructors interchangeably. If you want to write this I would go: data Foo = Bar Int | Foo Int def unFoo (Bar n) = n def unFoo (Foo n) = n f v = if even (unFoo n) then True else False You could also define the data type as data Foo = Bar { unFoo :: Int } | Foo { unFoo :: Int } As long as you make sure unFoo works for every possibility (otherwise it would be a partial function that could throw an exception). On Wed, Sep 18, 2013 at 10:08 AM, TP <paratribulations@free.fr> wrote:
Hi,
I have a question about pattern matching. Consider the following code:
------------------ data Foo = Bar Int | Foo Int
f :: Foo -> Bool f (Foo n) | even n = True | odd n = False f (Bar n) | even n = True | odd n = False
main = do
print $ f $ Bar 1 print $ f $ Bar 2 print $ f $ Foo 1 print $ f $ Foo 2 ------------------
Why is it not possible to simply write for f:
f v = case v of _ n | even n -> True _ n | odd n -> False
or
f (_ n) | even n = True | odd n = False
(in both cases we get a parse error)?
Thanks,
TP
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners