[Haskell-beginners] A few really short beginners questions

Klaus Gy klausgy at gmail.com
Sun Oct 3 14:39:37 EDT 2010


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 <byorgey at seas.upenn.edu>:
- Zitierten Text ausblenden -
> 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>


More information about the Beginners mailing list