當我使用map時,如何獲取我在haskell中的元素的索引?Haskell中列表元素的索引
例如,我有這個列表l = "a+bc?|(de)*fg|h"
,我想知道當我使用map or scanl
函數時我所處的元素的確切索引。
當我使用map時,如何獲取我在haskell中的元素的索引?Haskell中列表元素的索引
例如,我有這個列表l = "a+bc?|(de)*fg|h"
,我想知道當我使用map or scanl
函數時我所處的元素的確切索引。
首先,如果您在處理列表時需要索引,則表明您正在實施次優算法,因爲列表不是像數組這樣的基於索引的結構。如果您需要處理索引,最好考慮使用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')]
修訂尼基塔沃爾科夫的回答,您可以使用的功能,如:
-- 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..]
在處理列表時(例如,用於錯誤報告),具有可供您使用的索引是非常常見的要求。 – 2013-04-24 12:25:42
在處理與使用次優算法無關的列表時,索引有許多用途。所以這是一個非常不確定的跡象。 – 2014-05-04 10:37:19