1

私は Java のバックグラウンドから来て、Scala を学び始めたばかりです。関数の型パラメーターと型の推論を理解しようとしています。これは、Scala ドキュメントの標準的な例です。

class Decorator(left: String, right: String) {
  def layout[A](x: A) = left + x.toString() + right
}

object FunTest extends Application {
  def apply(f: Int => String, v: Int) = f(v)
  val decorator = new Decorator("[", "]")
  println(apply(decorator.layout, 7))
}

apply関数に型パラメーターを適用して厳密vな型を保持しようとすると、型の不一致が発生します。ここで型が推論されないのはなぜですか?

def apply[B](f: B => String, v: String) = f(v) //Type mismatch
def apply[B](f: B => String, v: B) = f(v)      //Works fine

ありがとう

4

1 に答える 1

1

apply本体なしで見てみましょう:

 def apply[B](f: B => String, v: String)

それは、 "applyは型でパラメーター化された関数 (メソッド)であり、 toBから関数を受け取り、" .BStringString

B型変数と考えてください。ある時点でインスタンス化する必要があります。その点はの宣言ではありませんapply。apply が、まあ、適用されたときです ;-)

この契約では、次のような使用が許可されている必要があります。

 def g(i: Int): String = "i is " + i

 apply(g, "foo")  // Here the type variable `B` is "instantiated" to the type Int,

しかし、あなたが のような体を持っていることを考えるとf(v)、単に代入すると、矛盾が見えます:

代わりの

 f(v)

 g("foo") // can't compile; g takes a B, which is an Int
于 2013-11-03T17:48:06.280 に答える