haskell 组合多个函数与'filter'一起使用[duplicate]

oknwwptz  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(172)

此问题在此处已有答案

Elegant way to combine multiple filtering functions in Haskell(6个答案)
5天前关闭。
我有两个函数,我想合并使用filter来过滤Item列表。
这里有一个最小的例子,我试图实现什么:

  1. data Item = Item { itemName :: String, itemSize :: Int }
  2. hasName :: String -> Item -> Bool
  3. hasName name i
  4. | itemName i == name = True
  5. | otherwise = False
  6. hasSize :: Int -> Item -> Bool
  7. hasSize size i
  8. | itemSize i == size = True
  9. | otherwise = False

我所知道的筛选具有“This”namesize 42的项目的唯一解决方案是调用filter * 两次 *:

  1. items = [Item "This" 2, Item "That" 42, Item "This" 42, Item "No" 9]
  2. filter (hasName "This") $ filter (hasSize 42) items

然而,我想知道是否有某种方法可以将这两个函数“合并”在一起,并且只调用一次filter

4dc9hkyq

4dc9hkyq1#

您可以使用lambda:

  1. filter (\i -> hasName "This" i && hasSize 42 i) items

或者,您可以定义自己的辅助述词函数:

  1. let condition i = hasName "This" i && hasSize 42 i
  2. in filter condition items

存在更高级的替代方案,但(IMO)可读性较差:

  1. filter (and . sequence [hasName "This", hasSize 42]) items

另请参阅:Elegant way to combine multiple filtering functions in Haskell

相关问题