比较同一索引处的元素

时间:2017-02-13 20:33:11

标签: haskell

我正在尝试比较haskell中两个列表的相同索引处的元素。如果两个元素在同一个索引上相等,那么我必须返回该索引。 我知道如何使用filter和zip比较两个函数,但我的函数返回值而不是索引。

 compare l1 l2 = map fst . filter (\(x,y) -> x == y) $ zip l1 l2

当我用ghci运行时,我有

compare [1,2,3,4,5] [1,2,3,7,8,9,11,5]
[1,2,3]

我希望改为[0,1,2]。任何人都可以给我提示如何解决这个问题吗?

3 个答案:

答案 0 :(得分:7)

您可以使用zip3[0..]将索引包含为大小为3的元组的第一项:

compare l1 l2 = map (\(i, _, _) -> i) . filter (\(_, x,y) -> x == y) $ zip3 [0..] l1 l2

答案 1 :(得分:5)

列表理解使得Chad Gilbert的回答更加清晰。

compare l1 l2 = [i | (i, x, y) <- zip3 [0..] l1 l2, x == y]

答案 2 :(得分:4)

使用findIndices中的Data.List功能。在ghci:

Data.List> findIndices id $ zipWith (==) [1,2,3,4,5] [1,2,3,7,8,9,11,5]
[0,1,2]