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

时间:2014-03-15 15:26:50

标签: haskell monads

我发现自己在写这个:

and_then :: x -> Maybe [x] -> Maybe [x]
x `and_then` mxs = do
  xs <- mxs
  return (x:xs)

有没有更简单的方法来实现同样的目标?

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

z : process xs ys

我现在必须写

z `and_then` process xs ys

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

1 个答案:

答案 0 :(得分:11)

由于您的do符号仅调用Maybe图层,因此我们可能会认为(:)操作独立于Maybe的效果 - 它& #39; s只是传递给Maybe中包含的值的另一个函数。这导致我们稍微概括一下代码

foo :: (x -> b -> b) -> x -> Maybe b -> Maybe b
foo f x m = do
  b <- m
  return (f x b)

这使我们更清楚地知道我们只处理fmap

fmap fx m = do b <- m
               return (fx b)

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

(z:) <$> process xs ys