You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个函数组合后与Haskell的filter一起使用?

如何组合过滤函数实现单次filter筛选

当然可以!你有几种简洁的方式把两个过滤条件合并,只调用一次filter就能完成筛选:

方法1:直接用匿名函数结合逻辑与

最直观的写法就是在filter里定义一个匿名函数,同时检查两个条件:

items = [Item "This" 2, Item "That" 42, Item "This" 42, Item "No" 9]
filter (\item -> hasName "This" item && hasSize 42 item) items

方法2:封装成可复用的组合函数

如果这个组合条件需要多次使用,可以把它封装成一个独立的函数:

hasNameAndSize :: String -> Int -> Item -> Bool
hasNameAndSize targetName targetSize item = 
  hasName targetName item && hasSize targetSize item

-- 调用示例
filter (hasNameAndSize "This" 42) items

方法3:用Applicative组合器简化

借助Control.Applicative模块里的liftA2,可以更简洁地组合两个谓词函数(Item->Bool类型):

import Control.Applicative

filter (liftA2 (&&) (hasName "This") (hasSize 42)) items

liftA2 (&&)会把两个接收Item返回布尔值的函数,组合成一个新的函数——它会对同一个Item分别应用两个原函数,再把结果用&&合并。

不管用哪种方式,最终的筛选效果和两次filter调用完全一致,而且Haskell的惰性求值特性会保证列表只被遍历一次,效率上和两次调用没有区别,但单次filter的写法更紧凑。

内容的提问来源于stack exchange,提问作者Jir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:25:23