3

これが明白である場合はお詫びしますが、私はscalaに慣れていないため、次のコードで2つの予期しない動作が発生しています:

Seq(1, "a", 2, "b") map { 
    case i: Int => i+1
}

1) 文字列が変更されておらず、数値が 1 ずつ増加するコレクションを取得することを期待していましたが、代わりにエラーが発生しました。

2) このcase i: Int => i + 1構文は、Int 用に定義された部分関数を表していると思います。しかし、 map は total 関数を使用しているように見えますが、なぜこれがコンパイルされるのでしょうか? コンパイラが私を助けてくれる方がいいのではないでしょうか? 実行時例外をコンパイル時例外に移動することを常にお勧めします。

4

2 に答える 2

6

map()渡されたパラメータとして部分関数を取りませんが、取りますcollect()

Seq(1, "a", 2, "b") collect {
  case i: Int => i+1
}
//res0: Seq[Int] = List(2, 3)

部分関数に対して定義されていない入力が渡されず、単にドロップされることに注意してください。ドロップしたくないものには、それが単なるcase _ =>デフォルト ハンドラーであっても、ハンドラーが必要です。

Seq(1, "a", 2, "b", 'z') collect {
  case i: Int    => i+1        //increment ints
  case c: Char   => c.toUpper  //capitalize chars
  case s: String => s          //strings pass through
}
//res0: Seq[Any] = List(2, a, 3, b, Z)

部分関数をmap()コンパイラに渡すと、 trait PartialFunction[-A, +B] extends (A) => B. つまり、部分関数関数の一種です。

また、部分関数を扱う場合は...

isDefinedAt電話をかける前に電話をかけるのは発信者の責任applyです...

collect()したがって、それはそうであり、そうではないと結論付けることがmap()できます。

于 2019-06-19T20:42:29.570 に答える