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