Maybe :: * -> *; Maybe a = forall (maybeT::*) . maybeT->(a->maybeT)->maybeT; Nothing :: forall (a::*) . Maybe a; Nothing a = \ (maybeT::*) (nothing::maybeT) (just::a->maybeT) -> nothing; Just :: forall (a::*) . a -> Maybe a; Just a x = \ (maybeT::*) (nothing::maybeT) (just::a->maybeT) -> just x; maybe :: forall (a::*) (r::*) . r -> (a->r) -> Maybe a -> r; maybe a r nothing just s = s r nothing just;