有没有办法使用列表推导来编写Haskell过滤器函数的实现?
错误不断出现,我对如何接近它感到难过。这就是我所拥有的:
filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' f xs = [f x | x <- xs]
非常感谢任何指导或链接。
答案 0 :(得分:7)
是的,你可以把它写成:
filter' :: (a -> Bool) -> [a] -> [a]
filter' f xs = [x | x <- xs, f x]
如果在列表推导中添加一个表达式,并且计算结果为布尔值,那么您已经为列表推导添加了一个过滤器:只有当f x
在此计算为True
时,我们才会添加{{ 1}}到列表。
请注意,编写x
是没用的:如果您提供一个空列表,那么列表推导也会返回一个空列表,因为filter' _ [] = []
永远不会从x
中选择一个值与xs
。
但通常最好使用内置的filter :: (a -> Bool) -> [a] -> [a]
。