2013-04-24 135 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