作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望找到一种更好的方法来解决我在 Haskell 中遇到的问题。
给定一个列表和一个条件,创建一个仅包含满足条件的元素的新列表。下面是我使用的解决方案。是否有更好的替代方案不涉及可能?
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 a
和 Num a
顺便说一句:可以简单地对 cond x
的结果使用守卫或模式匹配。
过滤器
是 implemented 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
这里对于一个空列表,它因此返回空列表,当列表不为空时,它只会在满足 pred x
的情况下添加 x
。
关于haskell - 当条件为真时,如何在列表中添加内容,而在 Haskell 中什么都不做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70822010/
我是一名优秀的程序员,十分优秀!