2

int をリスト内の各値と比較するための再帰的なプログラムを作成しようとしています。問題は、到達不能エラーが発生し続けることです。その理由は本当にわかりません。私のコードは

def isIn(x : Int, l : List[Int]) : Boolean = l match {
  case Nil => false
  case x => true
  case h :: t => isIn(x, t)
}

なぜこれが機能しないのか、私には本当にわかりません。または、ケースを使用して x を head と比較する方法を考えています。

4

1 に答える 1

6

問題は、小文字で始まる変数を使用すると、パターンマッチャーが新しい変数に割り当てようとしていると見なすということです。もちろん、単に割り当て可能な変数であるパターンはすべてに一致するため、それ以降のパターンには到達できません。case

これを解決するには、「安定した識別子」を使用する必要があります。これは、小文字の変数をバッククォートに入れることで実行できます。

def isIn(x: Int, l: List[Int]): Boolean =
  l match {
    case Nil => false
    case `x` :: t => true
    case h :: t => isIn(x, t)
  }

または、大文字で始まるように変数の名前を変更します。

def isIn(X: Int, l: List[Int]): Boolean =
  l match {
    case Nil => false
    case X :: t => true
    case h :: t => isIn(X, t)
  }

caseそれぞれがである必要があるため、のヘッドと一致する必要があることを示すためListに、:: tafterが必要であることに注意してください。xxList

于 2012-09-04T00:49:56.437 に答える