2013-04-24 138 views
13

当我使用map时,如何获取我在haskell中的元素的索引?Haskell中列表元素的索引

例如,我有这个列表l = "a+bc?|(de)*fg|h",我想知道当我使用map or scanl函数时我所处的元素的确切索引。

回答

26

首先,如果您在处理列表时需要索引,则表明您正在实施次优算法,因为列表不是像数组这样的基于索引的结构。如果您需要处理索引,最好考虑使用vector

关于您的实际问题,你可以配对列表的项目与下面的代码递增整数,然后映射了结果:

Prelude> zip [0..] "a+bc?|(de)*fg|h" :: [(Int, Char)] 
[(0,'a'),(1,'+'),(2,'b'),(3,'c'),(4,'?'),(5,'|'),(6,'('),(7,'d'),(8,'e'),(9,')'),(10,'*'),(11,'f'),(12,'g'),(13,'|'),(14,'h')] 
+10

在处理列表时(例如,用于错误报告),具有可供您使用的索引是非常常见的要求。 – 2013-04-24 12:25:42

+8

在处理与使用次优算法无关的列表时,索引有许多用途。所以这是一个非常不确定的迹象。 – 2014-05-04 10:37:19

27

修订尼基塔沃尔科夫的回答,您可以使用的功能,如:

-- variant of map that passes each element's index as a second argument to f 
mapInd :: (a -> Int -> b) -> [a] -> [b] 
mapInd f l = zipWith f l [0..] 
+3

或'mapInd f l = zipWith f l [0 ..]'。 – dave4420 2013-04-24 13:05:57

+0

@ dave4420:好的,谢谢。 – 2013-04-24 14:02:08

+2

这已经很长时间了,但为了简洁起见,这也适用:'mapInd f = zipWith f [0 ..]' – Kittsil 2016-12-31 02:40:24