Инструмент, который вы ищете, уже существует. В Control.Monad есть два оператора композиции Клейсли.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
Когда m = Maybe, реализация composeMaybe становится очевидной:
composeMaybe = (>=>)
Глядя на определение (>=>)
,
f >=> g = \x -> f x >>= g
, который вы можете встроить, если вы хотите думать об этом в своих собственных терминах как
composeMaybe f g x = f x >>= g
или который можно записать в do
-сахар как:
composeMaybe f g x = do
y <- f x
g y
В общем, я бы просто использовал (>=>)
, что имеет хорошие теоретические основания для существования, потому что оно обеспечивает самый чистый способ сформулировать законы монады.