【问题标题】:Index of element in list in HaskellHaskell列表中元素的索引
【发布时间】:2013-04-17 23:51:50
【问题描述】:

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

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

【问题讨论】:

    标签: list haskell indexing


    【解决方案1】:

    首先,如果您在处理列表时需要索引,则表明您正在实施次优算法,因为列表不是像数组那样基于索引的结构。如果您需要处理索引,最好考虑使用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')]
    

    【讨论】:

    • 在处理列表时(例如用于错误报告),拥有可供您使用的索引是一个非常常见的要求。
    • 在处理与使用次优算法无关的列表时,索引有很多用途。所以这是一个非常不确定的信号。
    【解决方案2】:

    修改 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..]
    

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-10-09
      • 2013-01-11
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多