2017-06-23 10 views

答えて

2

これは、ケースに通常の変数を作成していないためです。

val (trainingData, TestData) = 

これは、左側のパターンマッチングを使用して右側の式を解くことです。従って、のパターンマッチングの変数は、小文字で始まる必要があります。

val (trainingData, TestData) = (split(0), split(1)) 

は、それが常に唯一の始動時に小文字の変数を受け入れるため失敗trainingData、テストデータに2つの分割された値を代入しようとし

(split(0), split(1)) match { 
     case (trainingData, TestData) => (trainingData, TestData) 
    } 

と同等になります。

むしろ、この意志はこれが意味

val (trainingData, testData) = (split(0), split(1)) 

正常に動作し、

(split(0), split(1)) match { 
     case (trainingData, testData) => (trainingData, testData) 
} 

は、この情報がお役に立てば幸い!

+0

説明していただきありがとうございますが、開始時に小文字の変数が必要なのはなぜですか? – wctapasadan

+0

小文字の変数は、変数を値とバインドするために使用されます。ここでは、大文字の変数を変数名と一致させるために使用されます。これは、https://stackoverflow.com/questions/35217913/whycant-upper-case-定義する値のためのパターンマッチングのための使用文字 –

1

Scalaでは、大文字の先頭に変数を作成できます。

val TestCnt = 7 

しかし、パターンマッチングによって変数を作成するときは、この操作を実行できません。

val (ch, num)  = ('x', 17) // OK 
val (Run, distance) = (true, 5) // error: not found: value Run 

それはなぜですか?これは、コンパイラが "定数パターン"と "可変パターン"を区別する必要があるためです。これは、Section 15.2, "Kinds of Patterns" [PiS(1st Edition)]で詳細に説明されていますが、大文字の大文字は定数と見なされ、パターンはこの値と正確に一致しなければならず、先頭の小文字は変数とみなされますこれは任意の値と一致し、その変数も値にバインドされます。

someTuple match { 
    case ('t', 42) => /*will match only if both elements match these values*/ 
    case (_, TestCnt) => /*will match only if 2nd element same value as TestCnt*/ 
    case (c, n)  => /*will match any 2-ple, variables c,n bound to values*/ 
} 

それは小文字-ある変数規則(使用バッククォート)の回避策があることは注目に値しますが、大文字は、ある一定のルールを回避する方法はありません。