这个功能是否已经存在?(也许是monad)

Mat*_*hid 1 monads haskell

我发现自己在写这个:

and_then :: x -> Maybe [x] -> Maybe [x]
x `and_then` mxs = do
  xs <- mxs
  return (x:xs)
Run Code Online (Sandbox Code Playgroud)

是否有一些更简单的方法来实现同样的事情?

基本上这是处理列表的标准递归循环 - 除了处理可能失败(这与结果只是一个空列表不同).这意味着我通常写的地方

z : process xs ys
Run Code Online (Sandbox Code Playgroud)

我现在要写

z `and_then` process xs ys
Run Code Online (Sandbox Code Playgroud)

由于这是一个相当普遍的习语,我想知道一些预先存在的功能是否可以帮助我.(几个Hoogle搜索未能找到类似于上述类型的任何函数.)

J. *_*son 11

由于你的do符号只是调用Maybe图层,我们可能会认为(:)操作独立于Maybe效果 - 它只是传递给包含的值的另一个函数Maybe.这导致我们稍微概括了代码

foo :: (x -> b -> b) -> x -> Maybe b -> Maybe b
foo f x m = do
  b <- m
  return (f x b)
Run Code Online (Sandbox Code Playgroud)

这使我们更清楚地知道我们只是处理一个问题 fmap

fmap fx m = do b <- m
               return (fx b)
Run Code Online (Sandbox Code Playgroud)

因此,编写所需功能的最标准方法可能是

(z:) <$> process xs ys
Run Code Online (Sandbox Code Playgroud)