[Haskell-cafe] Curious Functor Class

Ashley Yakeley ashley at semantic.org
Tue Sep 26 04:03:59 EDT 2006

Is there anything useful about the class of functors which foralls can 
move across? In other words, functors f, for which for any function g 
there is this isomorphism

  f (forall a. g a) <=> forall a. f (g a)

In this Haskell snippet I've called the class Hoistable and the 
isomorphism is (hoist,unhoist):

  newtype All g = MkAll (forall a. g a);

  class (Functor f) => Hoistable f where
    hoist :: forall g. (f (All g) -> (forall a. f (g a)));
    hoist = fmap (\(MkAll ga) -> ga);

    unhoist :: forall g. ((forall a. f (g a)) -> f (All g));

Functors that can be made instances of Hoistable:

  data Singleton a = MkSingleton
  newtype Identity a = MkIdentity a
  (->) p -- forall p.
  data Pair a = MkPair a a
  data Extra p a = MkExtra p a -- forall p.
  data Compose p q a = MkCompose (p (q a))
    -- forall p q. (Hoistable p,Hoistable q) =>

On the other hand, Maybe and Either cannot. The key seems to be in only 
having one "form", i.e. no "|"s in the definition. Does this class 
actually have a use, or is it merely a curiosity?

Ashley Yakeley
Seattle WA

More information about the Haskell-Cafe mailing list