0

たとえば、このコードは をコンパイルして出力します。これfalseは、Scala コンパイラが を作成する代わりに暗黙的Intに s をs に変換するためです。これは奇妙に思えます。危険な暗黙の変換を持つ可能性のある他の型で同様のことを行います)。なぜ Scala の設計者はこの方法を選択したのでしょうか? (私はバージョン 2.9 を使用しています)DoubleList[AnyVal]

object Main {
    def main(args: Array[String]) {
        val x = List(3, 2)
        val y = List(3, 2.0)
        println(x.head / 2 == y.head / 2)
    }
}
4

3 に答える 3

2

Listsは均一に型付けされています。異なるタイプのアイテムをに入れるときList、コンパイラはリスト全体にどのタイプを与えるかを理解する必要があります。DoubleとIntをに入れるとList、Scalaは、のタイプを決定しListますList[Double]。これは、両方のアイテムを変換できるものだからです。REPLで参照してください:

scala> val y = List(3, 2.0)
y: List[Double] = List(3.0, 2.0)

修正は、リストを手動で次のように変換することList[Int]です。

scala> val y = List(3, 2.0).map(_.toInt)
y: List[Int] = List(3, 2)

そうすれば、あなたのテストが出てきますtrue

scala> println(x.head / 2 == y.head / 2)
true
于 2012-09-26T06:22:36.617 に答える
1

ここでの可能性は2つだけです。に昇格するDoubleか、に拡大しAnyValます。後者の場合、分割も定義されていないので、役に立たない。この動作を要求する場合は、タイプを明示的に指定できます。

val y = List[AnyVal](3,2.0)
y.head match {
  case i: Int => println("Whew, it is still an int!")  // This is printed
  case _ => println("Bah, it messed up again")
}
于 2012-09-26T06:22:46.683 に答える
0

浮動小数点型に変換したくないのなら、なぜ浮動小数点数を持つリストを作成するのでしょうか? それを望まない場合は、浮動小数点数を入れたり、それらの浮動小数点数を非浮動小数点数に変換したりしないでください。

于 2012-09-26T06:27:12.110 に答える