[Haskell-beginners] A few really short beginners questions
Brent Yorgey
byorgey at seas.upenn.edu
Sun Oct 3 14:10:24 EDT 2010
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
More information about the Beginners
mailing list