Не относится. Вы заново открыли Monadi c bind:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Either x
- это монада:
> Left "a" >>= (\x -> Right (1+x))
Left "a"
> Right 1 >>= (\x -> Right (1+x))
Right 2
Объединение двух функций, создающих монады, как у вас, сделано с композицией Kleisli оператор, например f <=< g
, или эквивалентно в другом направлении g >=> f
с оператором прямого сложения,
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
, с этими типами легче следовать:
f :: b -> Either x c
g :: a -> Either x b
-----------------------------------------
g >=> f :: a -> Either x c
Фактически, один из способов суммировать монады состоит в том, чтобы сказать, что они относятся к обобщенной композиции функции .
>=>
определяется просто как
(g >=> f) x = g x >>= f
(f <=< g) x = g x >>= f = f =<< g x
См. Также: