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

时间:2015-07-08 00:34:25

标签: haskell monads

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

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

我相信它看起来与此相似(这肯定不起作用):

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

你会怎么写呢?

1 个答案:

答案 0 :(得分:6)

无需解决所有麻烦。

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)