【问题标题】:Index contents of a list ([a] -> [(Int, a)])列表的索引内容 ([a] -> [(Int, a)])
【发布时间】:2015-07-08 09:04:38
【问题描述】:

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

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

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

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

你会怎么写?

【问题讨论】:

标签: haskell monads


【解决方案1】:

没必要这么麻烦。

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)

【讨论】:

  • 哈哈,真聪明!感谢您的回答。但我仍然想知道如何在 Monad 转换器中实现它。
  • @RyoichiroOka 在this question 中有不同的方法可以做到这一点。
  • @RyoichiroOka:已编辑。
  • @RyoichiroOka,以防万一您想到错误:zip [0..] 并不是在这种情况下适用的聪明技巧,通常您需要一个状态转换器;相反,状态几乎从不需要,大多数问题都可以通过组合标准函数来解决。国家真的应该是你最后的手段之一。
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 2019-05-06
  • 2021-09-17
  • 1970-01-01
  • 2013-11-05
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多