composeMaybe请注意's 参数的类型与单子绑定运算符对其后一个参数所需的类型有多接近:
ghci> :t (>>=)
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b
f和的顺序g对于组合来说是倒退的,那么一个更好的名字怎么样?
thenMaybe :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
thenMaybe f g = (>>= g) . (>>= f) . return
给定以下定义
times3 x = Just $ x * 3
saferecip x
| x == 0 = Nothing
| otherwise = Just $ 1 / x
例如,一个可以
ghci> saferecip `thenMaybe` times3 $ 4
Just 0.75
ghci> saferecip `thenMaybe` times3 $ 8
Just 0.375
ghci> saferecip `thenMaybe` times3 $ 0
Nothing
ghci> times3 `thenMaybe` saferecip $ 0
Nothing
ghci> times3 `thenMaybe` saferecip $ 1
Just 0.3333333333333333