scala中无法访问的代码?

时间:2014-06-10 19:09:03

标签: scala pattern-matching unreachable-code

由于某种原因,以下代码无法访问。我无法理解为什么我的代码永远不会到达,因为这是一个简单的模式匹配。这是:

type Occurrences = List[(Char, Int)]

def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match{
  case Nil => Nil
  case List() => List()
  case x => List(x)
  case x::xs => combinations(List((x._1,x._2 - 1))) ::: combinations(xs)
}

此算法旨在提取给定列表的所有子列表。

4 个答案:

答案 0 :(得分:5)

case x => List(x)匹配任何内容。看起来您想要匹配1个元素的列表,以便您可以使用:

case l@List(_) => List(l)

答案 1 :(得分:3)

scala> Nil == List()
res0: Boolean = true

您对List()的看法是什么?

顺便说一下,错误信息确切地告诉你问题是什么:

scala> def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match{
     |   case Nil => Nil
     |   case List() => List()
     |   case x => List(x)
     |   case x::xs => combinations(List((x._1,x._2 - 1))) ::: combinations(xs)
     | }
<console>:11: warning: patterns after a variable pattern cannot match (SLS 8.1.1)
         case x => List(x)
              ^
<console>:12: warning: unreachable code due to variable pattern 'x' on line 11
         case x::xs => combinations(List((x._1,x._2 - 1))) ::: combinations(xs)
                                                           ^
<console>:12: warning: unreachable code
         case x::xs => combinations(List((x._1,x._2 - 1))) ::: combinations(xs)
                                                           ^
combinations: (occurrences: Occurrences)List[Occurrences]

答案 2 :(得分:1)

我是Scala的新手,我遇到了类似的问题,并对编译器发出的警告感到困惑。如果其他人遇到同样的事情,这就是困扰我和我的解决方案的原因。

我的编译器给了我一个大致相同的警告(但是我用OP的代码代替我的代码):

[warn] path/to/file.scala:123: unreachable code
case x::xs => combinations(List((x._1,x._2 - 1))) ::: combinations(xs)
                                                   ^

编译器指向最后一个case语句中的符号,实际上(正如其他人提到的那样)问题出在List()case语句中。我首先误以为这意味着编译器打印的case语句中存在问题。 (就我而言,我以为我错误地使用了'::'。)

编译器消息的含义是语句无法访问,与它指向的字符无关。正如其他人所提到的那样,语句无法访问的原因是List()语句是一个全能的,并且匹配不会流向其他情况。

要解决此问题,请确保逻辑可以流向所有情况,并且不会陷入困境。即从最具体到最不具体。我还试图通过元素数量来匹配列表,这是我的解决方案[编译和工作,没有任何警告!]:

def myFunction(myList: List[MyType]) = myList match {
   case x1 :: x2 :: xs => // match 2+ elems
   case x :: xs => // match 1+ elems
   case Nil => // match 0 elems

但是,如果我重新安排前两行,我再次得到无法访问的代码警告,因为匹配2+案例更具体比1+案例[不起作用,以及无法访问的代码警告!]:

def myFunction(myList: List[MyType]) = myList match {
   case x :: xs => // match 1+ elems
   case x1 :: x2 :: xs => // match 2+ elems
   case Nil => // match 0 elems

答案 3 :(得分:0)

我想你想要将一个元素与case x => List(x)匹配。这符合任何事情 请改用case x :: Nil => List(x)