I wrote:
> keep :: (forall c . (t ->  c) ->  u ->  c) ->  ((t1 ->  t) ->  b) -> (t1 ->  
> u) -> b
> keep transform rec = \fn -> rec $ transform id . fn

Just to clarify - you don't really need the RankNTypes here, I just
wrote it that way so you could see what I had been thinking,
and to make it clear how the first parameter of keep
takes transformers like drop'. But you could write it as

keep :: ((t -> t) -> u -> t) -> ...

and it would work just fine, because transformers like drop'
would specialize nicely to what you need for keep.

If you let GHC deduce the type of keep from its definition,
GHC comes up with something else:

keep :: ((a -> a) -> u -> t) -> ((t1 -> t) -> b) -> (t1 -> u) -> b

That also works, but it's weird. It generalizes in a direction
that we don't really need here, and thus obscures the meaning
of what we're doing.

Regards,
Yitz
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to