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

Haskell中如何筛选出第二个元素存在于另一列表中的元组?

在Haskell中筛选第二个元素属于指定列表的元组

当然可以实现这个需求,核心思路是用filter函数结合元素存在性判断,下面给出两种实现方式:

基础实现(适合小数据量)

直接利用elem函数判断元组的第二个元素是否在指定键列表中:

-- 类型约束:元组的第二个元素类型需要支持相等判断
filterTuples :: Eq a => [a] -> [(b, a)] -> [(b, a)]
filterTuples keys = filter (\(_, val) -> val `elem` keys)

示例测试

给定:

  • 键列表:[1, 2, 3]
  • 元组列表:[('foo', 2), ('bar', 3), ('oof', 2), ('rab', 5)]

调用函数:

filterTuples [1,2,3] [('foo',2),('bar',3),('oof',2),('rab',5)]

得到结果:[('foo',2),('bar',3),('oof',2)]

优化实现(适合大数据量)

如果键列表元素较多,elem的线性查找效率较低,可以借助Data.Set将键列表转换为集合,利用集合的O(log n)成员判断提升性能:

import qualified Data.Set as Set

-- 类型约束:元组的第二个元素类型需要支持排序(Set的要求)
filterTuplesFast :: Ord a => [a] -> [(b, a)] -> [(b, a)]
filterTuplesFast keys = 
    let keySet = Set.fromList keys
    in filter (\(_, val) -> Set.member val keySet)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:55:20