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