On Jun 8, 2007, at 16:25 , Emilio Jesús Gallego Arias wrote:

Yeah, in general Haskell types don't carry constraints, however, I don't
see the reason that this doesn't work when using type level macros, as

type F a = C a => a

should just be a macro and substitute.

It is.  That's the problem.

Macros can't know anything about the contexts in which they're used. In the type system, this translates to implicit "forall" constraints:

> type F' a = forall a. C a => a

The result of this is that a simple use like

> foo :: F a -> F a

expands the macros literally, with the implicit "forall" because the macro expansion has to assume it is independent of everything else:

> foo' :: (forall a. C a => a) -> (forall a. C a => a)

This means the two "a"s are independent and can't be unified by the typechecker.

In theory I suppose the simple macro expansion could be replaced by some type expression which would allow the typechecker to recognize that any (F a)s used in a given type can be unified, but I have no idea what it would look like. (Then again, I'm no type hacker.) And I find myself wondering if that would lead to problems when expanding complex types.

--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] [EMAIL PROTECTED]
system administrator [openafs,heimdal,too many hats] [EMAIL PROTECTED]
electrical and computer engineering, carnegie mellon university    KF8NH


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to