Scala - 模式匹配和 For 循环问题

标签 scala for-loop pattern-matching

我正在尝试解决 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/

相关文章:

scala - scala.concurrent.blocking 的坏用例?

java.lang.NoSuchFieldError : cypher_parser_version

Scala 类型类最佳实践

javascript - 将 for..in 循环与 Promise 和异步函数结合使用

javascript - 匹配括号内的内容

scala - 猫中的右分离

javascript - 如何在一个框架中创建多个对象? (创意编码)

for-loop - 如何在for循环中增加计数器? (帕斯卡)

regex - 使用 awk 仅返回某些数据 block

sql - PostgreSQL 反向 LIKE