Chr*_*Dee 4 error-handling haskell function composition
我得到的问题说:
以类似于mapMaybe的方式,定义函数:composeMaybe ::(a-> Maybe b) - >(b - > Maybe c) - >(a-> Maybe c),它组成两个错误提升函数.
类型Maybe a和函数mapMaybe的编码如下:
data Maybe a = Nothing | Just a
mapMaybe g Nothing = Nothing
mapMaybe g (Just x) = Just (g x)
Run Code Online (Sandbox Code Playgroud)
我尝试使用这样的组合:
composeMaybe f g = f.g
Run Code Online (Sandbox Code Playgroud)
但它没有编译.
有人能指出我正确的方向吗?
您正在寻找的工具已经存在.Control.Monad中有两个Kleisli组合运算符.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
Run Code Online (Sandbox Code Playgroud)
当m = Maybe时,composeMaybe的实现变得明显:
composeMaybe = (>=>)
Run Code Online (Sandbox Code Playgroud)
看看定义(>=>),
f >=> g = \x -> f x >>= g
Run Code Online (Sandbox Code Playgroud)
如果您想以自己的方式考虑它,可以内联
composeMaybe f g x = f x >>= g
Run Code Online (Sandbox Code Playgroud)
或者可以写成do-sugar:
composeMaybe f g x = do
y <- f x
g y
Run Code Online (Sandbox Code Playgroud)
一般来说,我只是坚持使用(>=>),这有很好的理论原因,因为它提供了最简洁的方式来陈述monad定律.
首先:如果它应该是什么g.f,不是f.g因为你想要一个与f相同的参数的函数,并给出与g相同的返回值.但是这不起作用,因为f的返回类型不等于g的参数类型(f的返回类型中有一个Maybe而g的参数类型没有).
所以你需要做的是:定义一个Maybe b以参数为参数的函数.如果那个论点是Nothing,它应该返回Nothing.如果参数是Just b,它应该返回g b.composeMaybe应该用f返回函数的组成.