{-# LANGUAGE RankNTypes #-}
type Either x y = forall r. (x -> r) -> (y -> r) -> r
left :: x -> Either x y
left x f g = f x
right :: y -> Either x y
right y f g = g y
This is one example; it seems that just about any algebraic type can
be encoded this way. I presume that somebody else has thought of
this before. Does it have a name?