Я спрашиваю, потому что при цепочке, я полагаю, вам понадобятся обертки для других монад, таких как Either.
Правильно. Каждый конструктор типов, такой как Maybe
и Either
, нуждается в своем собственном определении для таких вещей, как >>=
и return
, но это именно то, чем является экземпляр класса типов: определения методов класса типов, специализированные для конкретного конструктора типов. Например,
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
instance Monad Maybe where
return = Just
Nothing >>= _ = Nothing
(Just x) >>= f = f x
-- This looks similar to the Maybe instance because in some sense,
-- Maybe is just a special case of Either: Maybe ~ Either ()
instance Monad (Either a) where
return = Right
(Left x) >>= _ = Left x
(Right x) >>= f = f x
Ваша функция fm
может быть написана так, чтобы она работала для любой монады, а не только Maybe
:
fm :: Maybe m => Int -> m Int
fm x = f1 x >>= return . f2 >>= f3