
Thank You very much for the fast replies! I think I expressed myself
badly in the first question. What does not work is the following:
class Test a
instance Num a => Test a
Thanks, fweth
2010/10/3, Brent Yorgey
On Sun, Oct 03, 2010 at 08:00:19PM +0200, Klaus Gy wrote:
Hi! I have a few questions to improve my knowledge of Haskell. I didn't stumble over these problems while working on specific tasks, I more or less constructed them explicitly to get an adequate understanding of the basic Haskell semantics.
1
Why can't I apply a class directly to all instances of another, existing class? For example why is it possible to write
class Test a
instance Num a => Test [a]
but not with
instance Num a => Test a
in the last row?
Because these two instances are overlapping: if an instance for Test [Int] was wanted, which instance should be chosen? Both 'Test [a]' and 'Test a' match 'Test [Int]' so it is ambiguous. Now, it is possible to turn on the OverlappingInstances flag, in which case the 'more specific' instance (in this case Test [a]) would be chosen, but this is generally considered bad for your health unless you Know What You Are Doing (tm).
2
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.
There is no type information around at runtime, so if f is supposed to work for all types it must work *uniformly* for all types: it is not possible to say "if the argument is a Char, do this; otherwise, do that".
3
Why is the following legal
[] :: Num a => [a]
but not with a self declared class instad of Num (unresolved overloading)?
It should be possible with a self declared class. I'd have to see more context to see why you are getting this error.
4
Why does in the declaration
f undefined = '0'
the expression undefined work apparently in the same way as a wildcard?
In a pattern, names simply match anything and bind that name to the value. The fact that you have used the name "undefined" is not relevant; it simply shadows any existing binding for the name "undefined". So
f blergh = '0'
is precisely the same as
f undefined = '0'
Also, consider this example:
x = 6
f x = 3 f _ = 9
At first glance you might think that f yields 3 when passed 6 as an argument and 9 for everything else; but in fact f always returns 3; the two x's have nothing to do with one another.
-Brent _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners