[Haskell-cafe] Higher-kinded Quantification

Dan Doel dan.doel at gmail.com
Tue Apr 12 21:35:18 CEST 2011


On Tuesday 12 April 2011 11:27:31 AM Leon Smith wrote:
> I think impredicative polymorphism is actually needed here;  if I write
> ...
> Then I get a type error
> ...

I'm not going to worry about the type error, because that wasn't what I had in 
mind for the types. The type for loop I had in mind was:

  [i] -> Iterator i o m a -> Iterator i o m a

Then, feedPure cracks open the first (forall m. ...), instantiates it to the m 
for the result, and runs loop on it. If we had explicit type application, it'd 
look like:

  feedPure l it = /\m -> loop l (it at m)

but as it is it's just:

  feedPure l it = loop l it

Which cannot be eta reduced.

> But what I find rather befuddling is the kind error:
> > feedPure' :: [i] -> Iterator i o (forall (m :: * -> *) . m) a -> Iterator
> > i o (forall (m :: * -> *) . m) a feedPure' = undefined
> 
> Iterator.hs:193:58:
>     `m' is not applied to enough type arguments
>     Expected kind `*', but `m' has kind `* -> *'
>     In the type signature for `feedPure'':
>       feedPure' :: [i]
>                    -> Iterator i o (forall m :: (* -> *). m) a
>                       -> Iterator i o (forall m :: (* -> *). m) a
> 
> Is impredicative polymorphism restricted to the kind *?

The problem is that (forall (m :: * -> *). m) is not a valid type, and forall 
is not a valid way to construct things with kind * -> *. You have:

  m :: * -> * |- T[m] :: * ==> |- (forall (m :: * -> *). T[m]) :: *

but that is the only way forall works.

-- Dan



More information about the Haskell-Cafe mailing list