如何将多个函数组合后与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
相关产品推荐
相关产品推荐

