
I have a quick question. Recall that: class Monad m where (>>=) :: m a -> (a -> m b) -> m b ... and suppose I have a data type Sample: data Sample a b = ... how could I define Sample to be an instance of Monad such that: (>>=) :: Sample a c -> (a -> Sample b c) -> Sample b c ? I would like to use a (\a -> ...)-like operator, but for types. So, something like this: instance Monad (\a -> Sample a c) where (>>=) :: Sample a c -> (a -> Sample b c) -> Sample b c a >>= f = ... but that obviously doesn't work. Alternatively I would like to use a type declaration and partially apply it: type SampleFlip b a = Sample a b instance Monad (SampleFlip c) where (>>=) :: SampleFlip c a -> (a -> SampleFlip c b) -> SampleFlip c b which translates to: (>>=) :: Sample a c -> (a -> Sample b c) -> Sample b c But this doesn't work either, and ghc extensions don't add this functionality. Can I do this in Haskell?