On Thu, Jan 1, 2009 at 12:36 AM, Max.cs <max.cs.2...@googlemail.com> wrote: > thanks! > > suppose we have > >> data Tree a = Leaf a | Branch (Tree a) (Tree a) deriving Show > > and how I could define a function foo :: a -> Tree a that > > foo a = Leaf a where a is not a type of Tree > foo b = b where b is one of the type of Tree (Leaf or > Branch) ? > > The following code seems not working...... > > foo (Leaf a) = a > foo a = Leaf a > > saying 'Couldn't match expected type `a' against inferred type `Btree a'' > > any idea? > > Thanks, > Max
You can't define such a function. foo :: a -> Tree a, but the definition foo b = b has the type a -> a, which is why the compiler says it can't match type "a" against "Tree a". In general, Haskell functions can't "look" at the type of their arguments: they are either monomorphic or are polymorphic, in which case you can only use polymorphic functions that match the polymorphic type. For the problem you are trying to solve, you probably need to encode this logic higher up in the overall function (e.g. have one function to deal with "a"s and another to deal with "Tree a"s). Hope that helps, Alex _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe