2017-02-13 52 views
2

我试图在haskell中两个列表的相同索引处比较元素。如果这两个元素在相同索引处相等,那么我必须返回该索引。 我知道如何比较两个函数使用过滤器和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]代替。任何人都可以给我提示如何去做这件事?

回答

7

你可以使用zip3[0..]到包括指数尺寸3的元组的第一项:

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

列表解析,使乍得吉尔伯特的回答干净了一点。

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

这是一个习惯和风格的问题。我会写'比较'xs ys = map fst。过滤器snd。 zip [0 ..] $ zipWith(==)xs ys' –

4

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

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