[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