Haskell中列表中元素的索引

use*_*465 15 indexing haskell list

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

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

Fre*_*Foo 30

修改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..]
Run Code Online (Sandbox Code Playgroud)


Nik*_*kov 29

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

关于您的实际问题,您可以使用以下代码将列表中的项目与递增的int配对,然后映射结果:

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')]
Run Code Online (Sandbox Code Playgroud)

  • 在处理列表时(例如,用于错误报告),使用索引是一个非常常见的要求. (12认同)
  • 处理与使用次优算法无关的列表时,索引有许多用途.所以这是一个非常不确定的迹象. (11认同)