2017-10-25 5 views
2

ここでスカラーコンパイラは何をしていますか?メソッドを呼び出すときの型依存の暗黙のキャスト

def f[A](x: A): A = { 
    x 
} 

f(1,2,3) 

res0: (Int, Int, Int) = (1,2,3)

私は、可変長引数であることをxを求めていませんよ。しかし、コンパイラは引数リストを製品タイプにキャストしているようです。私は型を指定した場合

、例えば

def f(x: Int): Int = { 
    x 
} 

してから呼び出すしよう

f(1,2,3) 

コンパイラはtoo many arguments (3) for method f

が、それはExpected Int and found (Int, Int, Int)を言うべきではないと主張していますか?

これはなぜですか?

答えて

3

Aは、Tuple3[Int, Int, Int] a.k.a. (Int, Int, Int)と推定されます。 f(1,2,3)f((1,2,3))に変換する構文上の機能を提供します。

+0

2番目のケースでは、それは実行されないので、関数型でキャスティングがdepedentです。 –

+1

@raul:はい、関数/メソッドのアプリケーション、オーバーロード、型推論などに関しては、Scalaコンパイラにはあらゆる種類の規則があります。これはScalaの面倒な領域の1つです。 [Dotty](http://dotty.epfl.ch/docs/reference/auto-parameter-tupling.html)では状況がさらに複雑になります。 –

関連する問題