如何在条件为真时向列表中添加内容并且在 Haskell 中不执行任何其他操作?

How can I add something to a list when a condition is true and do nothing otherwise in Haskell?

我希望找到更好的方法来解决我在 Haskell 中遇到的问题。

给定一个列表和一个条件,创建一个仅包含满足条件的元素的新列表。下面是我使用的解决方案。有没有更好的不涉及maybes的选择?

eg :: (Eq  a, Num  a) => (a -> Bool) -> [a] -> [a]
eg cond i = catMaybes (map (\x-> if cond x then Just x else Nothing) i)

您的 eg 相当于 filter :: (a -> Bool) -> [a] -> [a]。事实上,您可以过滤:

filter (\x -> some_condition x) my_list

如果 some_condition 是一个简单的 a -> Bool 函数,这相当于:

filter some_condition my_list

顺便说一下,您的 eg 实现和带有过滤器的实现都不需要 Eq aNum a 类型约束:可以简单地对结果使用守卫或模式匹配cond x.

filterimplemented with explicit recursion [src]:

filter :: (a -> Bool) -> [a] -> [a]
filter _pred []    = []
filter pred (x:xs)
  | pred x         = x : filter pred xs
  | otherwise      = filter pred xs

这里对于一个空列表它因此 returns 空列表,当列表不为空时,它只会在 x 满足 pred x 的情况下添加。