deriving over renamed types

Ashley Yakeley ashley@semantic.org
Wed, 3 Apr 2002 15:36:01 -0800


At 2002-04-03 15:14, Hal Daume III wrote:

>if I replace
>
>> type FM = FiniteMap
>
>with
>
>> type FM a b = FiniteMap a b
>
>it works fine.  I wasn't aware there was (supposed to be) a difference
>between these two declarations?  Is there?

I don't know about your example, but there is a difference.

  type FM = FiniteMap

...This defines FM as a type-constructor of kind (* -> * -> *) equivalent 
to FiniteMap.

  type FM a b = FiniteMap a b

...This defines FM as a pseudo-type-constructor. It has no kind, but must 
be specified with two arguments each of kind (*) so as to become a 
type-constructor (a type) of kind (*).

Unfortunately Haskell does not have lambda over types, otherwise the two 
could be the same. And then one could do things such as

  type M b a = a -> b;
  instance Cofunctor (M b) where ...

...which would be very useful, but would probably have unpleasant 
consequences for type inference...

-- 
Ashley Yakeley, Seattle WA