0

我正在尝试使用模式匹配来实现 scala splitAt,这就是我想要做的:

def split[T](someIndex:Int,someList:List[T]):(List[T],List[T]) = {
     def splitHelper[T](currentIndex:Int,someList:List[T],headList:List[T]):(List[T],List[T])= {
     (currentIndex,someList) match {
        case (someIndex,x::tail) => (x::headList,tail)
        case (currentIndex,x::y) => splitHelper(currentIndex+1,y,x::headList)
        case _ => (headList,headList)
        }
     }
     splitHelper(0,someList,List[T]())
}

编译器抱怨说:

<console>:15: error: unreachable code
 case (currentIndex,x::y) => splitHelper(currentIndex+1,y,x::headList)

有人可以指出我在这里做错了什么以及为什么我会收到无法访问的代码错误。

谢谢

4

1 回答 1

4

您应该在模式匹配中使用 `someIndex` 和 `currentIndex`(常量)。

scala> val a = 1
a: Int = 1

scala> 2 match {
     |   case a => println(a)
     | }
2

scala> 2 match {
     |   case `a` => println("a")
     |   case _ => println("Oops")
     | }
Oops

Scala 编程,第一版的第 15 章。Martin Odersky、Lex Spoon 和 Bill Venners 的“案例类和模式匹配”

如果需要,您仍然可以使用小写名称作为模式常量,使用两种技巧之一。首先,如果常量是某个对象的字段,您可以在它前面加上一个限定符。例如,pi 是一个变量模式,但 this.pi 或 obj.pi 是常量,即使它们以小写字母开头。如果这不起作用(例如,因为 pi 是一个局部变量),您也可以将变量名称括在反引号中。

于 2012-06-02T14:36:28.697 回答