Jon Fairbairn wrote:
If you allow quantification over higher
kinds, you can do something like this:

  d f = f . f

  d:: âa::*, b::*â*.(b a â a) â b (b a)â a


What's the problem with

d :: (forall c . b c -> c) -> b (b a) -> a
d f = f . f

to which ghci gives the type

d :: forall a b. (forall c. b c -> c) -> b (b a) -> a


It's too restrictive: it requires that the argument to d be
polymorphic, so if f:: [Int]->[Int], d f won't typecheck.

Oh, that's bad.

It
also requires that the type of f have an application on the
lhs, so f :: Int->Int won't allow d f to typecheck either.

This part I don't understand - isn't b anything in *->*? Can't b be the identity functor?


Jim

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to