此问题在此处已有答案:
Elegant way to combine multiple filtering functions in Haskell(6个答案)
5天前关闭。
我有两个函数,我想合并使用filter
来过滤Item
列表。
这里有一个最小的例子,我试图实现什么:
data Item = Item { itemName :: String, itemSize :: Int }
hasName :: String -> Item -> Bool
hasName name i
| itemName i == name = True
| otherwise = False
hasSize :: Int -> Item -> Bool
hasSize size i
| itemSize i == size = True
| otherwise = False
我所知道的筛选具有“This”name
和size
42的项目的唯一解决方案是调用filter * 两次 *:
items = [Item "This" 2, Item "That" 42, Item "This" 42, Item "No" 9]
filter (hasName "This") $ filter (hasSize 42) items
然而,我想知道是否有某种方法可以将这两个函数“合并”在一起,并且只调用一次filter
。
1条答案
按热度按时间4dc9hkyq1#
您可以使用lambda:
或者,您可以定义自己的辅助述词函数:
存在更高级的替代方案,但(IMO)可读性较差:
另请参阅:Elegant way to combine multiple filtering functions in Haskell