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