根据一个元素过滤3个(或更大)元组的列表

时间:2018-06-28 11:42:49

标签: haskell

假设我有一个三元组列表,例如:

[(1,2,3),(4,5,6),(7,8,9)]

如果我想查找每个项目的第一个元素是filter的话,如何通过这些方法1filter ((==1).fst)不能使用,因为元组的长度不等于2。我有一些想法,但是我似乎无法将它们发展为可行的代码,所以我想看看是否有更好的方法解决方案对此语言更了解的人可能会建议。

2 个答案:

答案 0 :(得分:1)

使用静态键入时,最简单的方法可能是手动键入所有逗号:

filter (\(x,_,_) -> x == 1) [(1,2,3),(4,5,6),(7,8,9)]

(您可以尝试使之自动化,例如,将fst的通用版本编写为类方法,但是随后您需要手动声明每个元组大小都是该类的一个实例。)

答案 1 :(得分:0)

您可以使用镜头库,该镜头库提供了一个在元组上运行的镜头。

import Control.Lens

filter ((== 1) . (^. _1)) [(1, 2, 3), (4, 5, 6), (7, 8, 9)]

镜头使用诸如Field1 Field2 ...之类的类型类使上面的代码成为可能。