我发现自己在写这个:
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搜索未能找到类似于上述类型的任何函数。)
答案 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