在Haskell中编写两个错误提升函数

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)

但它没有编译.

有人能指出我正确的方向吗?

Edw*_*ETT 7

您正在寻找的工具已经存在.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定律.


sep*_*p2k 6

首先:如果它应该是什么g.f,不是f.g因为你想要一个与f相同的参数的函数,并给出与g相同的返回值.但是这不起作用,因为f的返回类型不等于g的参数类型(f的返回类型中有一个Maybe而g的参数类型没有).

所以你需要做的是:定义一个Maybe b以参数为参数的函数.如果那个论点是Nothing,它应该返回Nothing.如果参数是Just b,它应该返回g b.composeMaybe应该用f返回函数的组成.


3le*_*gos 5

这是一个关于Haskell monad 的优秀教程(特别是在第一个例子中使用的Maybe monad).