data ApplicativeI f =
AI { pure :: forall a. a -> f a
, ap :: forall a b. f (a -> b) -> f a -> f b
, _FunctorI :: FunctorI f }
data MonadI m =
AI { bind :: forall a b. (a -> m b) -> m a -> m b
, _ApplicativeI :: ApplicativeI m }
return :: _MonadI m -> a -> m a
return (MonadI { _ApplicativeI = ApplicativeI { pure = fn } }) = fn
Almost, but that's not extensible: I can't declare some new typeclass Foo and then declare that every x s.t. Monad x is also Foo x without editing the definition of Monad.
[1] http://www.haskellforall.com/2012/05/scrap-your-type-classes...