[Haskell-beginners] A few really short beginners questions

Brent Yorgey byorgey at seas.upenn.edu
Mon Oct 4 09:43:12 EDT 2010


On Mon, Oct 04, 2010 at 12:05:55AM +0200, Klaus Gy wrote:
> 2010/10/3, Isaac Dupree <ml at isaac.cedarswampstudios.org>:
> > On 10/03/10 14:39, Klaus Gy wrote:
> >> 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
> >
> > For a reason that seems pretty odd until you get used to it.
> > In the instance, "Test a", or the "a" thereof, is called the "instance
> > head".  "Num a" is called the "context".  When the compiler looks for an
> > instance, it works by looking just at the "instance head": and "a"
> > refers to all types.  "instance Num a =>  Test a" says that the one and
> > only instance that the class has is the one described in that instance.
> >   (And it only works when "a" is a Num type; for other attempted uses
> > you'd get a compile error.)  For various reasons, such instances aren't
> > allowed by default.
> >
> > Note that instance Num a =>  Test [a] might also mean something
> > different than you intended, even though it's allowed: it defines the
> > one and only instance of Test on lists.
> >
> > -Isaac
> 
> Thanks! I could have avoided this question because I've just found out
> that the details of instance declarations are all described in the
> Haskell 98 report along with other restrictions I was not aware of.
> So, can I assume that there is no need in praxis to declare all
> instances of an existing class to instances of a new class?

No, this is a reasonable thing to do sometimes.  As the error message
says, if you want to enable this you can turn on the FlexibleInstances
flag (either by passing -XFlexibleInstances to the compiler, or by
putting

{-# LANGUAGE FlexibleInstances #-}

at the top of your program).

-Brent


More information about the Beginners mailing list