列表的索引内容 ([a] -> [(Int, a)])

Index contents of a list ([a] -> [(Int, a)])

我想要一个接受列表并索引所有内容的函数:indexed :: [a] -> [(Int, a)]。或者返回值可以是任何 Monad,只要它包含原始列表的索引值即可。

我认为我需要 StateT 在处理每个元素时临时记住和增加索引号,但我对 Monad 转换器不熟悉,我需要一些帮助来编写函数。

我相信它看起来会像这样(这肯定行不通):

indexed ns = do
  n <- ns
  i <- get
  put (i + 1)
  return (i, n)

你会怎么写?

不用那么麻烦。

indexed = zip [0..]

如果你想使用 monad 转换器,我想是这样的:

indexed :: [a] -> [(Int, a)]
indexed ns = evalState (runListT lt) 0 where
    lt = do
        n <- ListT $ return ns
        i <- get <* modify (+1)
        return (i, n)