如何在条件为真时向列表中添加内容并且在 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 a
和 Num a
类型约束:可以简单地对结果使用守卫或模式匹配cond x
.
filter
是 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
这里对于一个空列表它因此 returns 空列表,当列表不为空时,它只会在 x
满足 pred x
的情况下添加。
我希望找到更好的方法来解决我在 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 a
和 Num a
类型约束:可以简单地对结果使用守卫或模式匹配cond x
.
filter
是 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
这里对于一个空列表它因此 returns 空列表,当列表不为空时,它只会在 x
满足 pred x
的情况下添加。