type specs not making it in to functions
Fergus Henderson
fjh@cs.mu.OZ.AU
Mon, 28 Jan 2002 19:21:24 +1100
On 25-Jan-2002, Hal Daume III <hdaume@ISI.EDU> wrote:
> consider the following definition:
>
> > class C a where foo :: a -> Int
> > instance C Bool where foo _ = 5
>
> I can then say:
>
> > bar :: C a => a -> Int
> > bar (x :: a) = foo (undefined :: a)
>
> But not:
>
> > bar :: C a => a -> Int
> > bar x = foo (undefined :: a)
>
> because it tries to use a new scope for the type variable a and doesn't
> unify it with the one in the type spec. Why not?
I don't know why it isn't the case in Haskell.
In Mercury we do allow type variables in function type declarations
to scope over explicit type qualifications in clause bodies.
One drawback with allowing this is that the type declaration may be
separated from the clause by an arbitrary amount of text,
e.g.
bar :: C a => a -> Int -- type var `a' introduced here...
foo :: Int
quux :: String
foo = 42
quux = "hello world"
bar x = foo (undefined :: a) -- ... and used here.
which means that this feature can be used in ways that have the
potential to make programs harder to read.
--
Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit
The University of Melbourne | of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.