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.