当我使用 map 时,如何获取我在 haskell 中的元素的索引?
例如,我有这个列表l = "a+bc?|(de)*fg|h"
,我想知道我在使用该map or scanl
函数时所在元素的确切索引。
修改 Nikita Volkov 的回答,您可以使用如下函数:
-- 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..]
首先,如果您在处理列表时需要索引,则表明您正在实现次优算法,因为列表不是像数组那样基于索引的结构。如果您需要处理索引,最好考虑使用向量。
关于您的实际问题,您可以使用以下代码将列表中的项目与递增整数配对,然后映射结果:
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')]