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

Programming in Scala, First Edition の第 15 章。Martin Odersky、Lex Spoon、および Bill Venners による「ケース クラスとパターン マッチング」 :

必要に応じて、2 つのトリックのいずれかを使用して、パターン定数に小文字の名前を引き続き使用できます。まず、定数が何らかのオブジェクトのフィールドである場合、修飾子を前に付けることができます。たとえば、pi は可変パターンですが、this.pi または obj.pi は小文字で始まっていても定数です。それがうまくいかない場合 (たとえば pi がローカル変数であるため)、変数名をバック ティックで囲むこともできます。

于 2012-06-02T14:36:28.697 に答える