我想要一个接受列表并为所有内容编制索引的函数: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)

关于haskell - 列表的索引内容([a]-> [(Int,a)]),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31281655/

10-11 00:26