我正在尝试比较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]
。任何人都可以给我提示如何解决这个问题吗?
答案 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]