
On Sun, Oct 03, 2010 at 11:11:47AM -0700, Andrew Sackville-West wrote:
Why is the following example not valid?
f :: a -> a f '0' = 0 f x = 1
I think the reason lies in the type system but I can't locate it exactly.
in the type declaration, you have claimed that f takes an object of one type and returns another object of that same type. That is, every instance of 'a' in the type declaration has to refer to the *same* type. 'a' gets bound to a specific type and must match that type throughout.
now, f '0' = 0 has type f::Num t => Char -> t. This means that f takes a char and returns some numeric type. But char is not an instance of Num, and so this definition of f does not match its type signature.
This is a good point, I hadn't even noticed the type mismatch! However, note that this isn't the whole story: f :: a -> a f '0' = 'a' f x = x does not work either, for the reasons I mentioned in my other email. -Brent