我正在尝试解决 S-99: Ninety-Nine Scala Problems 的第 12 个问题
Given a run-length code list generated as specified in problem P10, construct its uncompressed version. Example:
scala> decode(List((4, 'a), (1, 'b), (2, 'c), (2, 'a), (1, 'd), (4, 'e)))
res0: List[Symbol] = List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
我试图对列表中的元素进行模式匹配,然后使用 for 循环连接字符,但在第 5 行出现以下编译错误:
type mismatch; found : scala.collection.immutable.IndexedSeq[List[A]] required: List[A]
1 def decode[A](xs: List[(Int, A)]) : List[A] = xs match {
2 case Nil => Nil
3 case x :: xs => {
4 for {
5 i <- 1 to x._1
6 } yield (x._2) :: decode(xs)
7 }
8 }
抱歉,我开始使用 Scala。有人可以解释为什么会发生这种情况以及如何解决它吗?
最佳答案
你很接近 - 只是几个问题。这是我想出的固定版本:
def decode[A](xs: List[(Int, A)]) : List[A] = xs match {
case Nil => Nil
case x :: xs => (for {
i <- 1 to x._1
} yield (x._2)).toList ::: decode(xs)
}
第一件事——也可能是最重要的——是在 for-yield 周围的额外括号。如果没有这个,您将尝试产生 (x._2)::decode(xs)
,而不仅仅是 (x._2)
(为了弥补这一点,整个 case 周围的 {}
可以省略)。
接下来,for-yield 生成的是 IndexedSeq 而不是 List,因此我强制转换为 List(您可以通过各种方式处理这个问题,这只是最权宜之计)。
最后,连接到 decode(xs)
生成的 List 需要 :::
运算符(您也可以使用 ++
)而不是 ::
(前置单个条目,而不是子列表)。
关于Scala - 模式匹配和 For 循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19645961/