
Am Mittwoch, 21. Januar 2009 23:30 schrieb Kellen J. McClain:
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?
I think you can't. If it's possible, the best option would be to change the order of type parameters of Sample. If that's not possible, you can define newtype FSample b a = FS (Sample a b) and make that an instance of Monad. Somebody remind me, why does Haskell not have type-lambdas?