我正在尝试使用模式匹配来实现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)
有人可以指出我在这里做错了什么以及为什么我收到无法访问的代码错误。
由于
答案 0 :(得分: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
如果需要,您仍然可以使用小写名称作为模式 不变,使用两个技巧之一。首先,如果常数是一个字段 对于某个对象,您可以在其前面加上限定符。例如,pi 是一个变量模式,但是this.pi或obj.pi是常量 他们以小写字母开头。如果这不起作用(因为pi 如果是一个局部变量,你可以选择包含变量 后面的名字。