当我使用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