Scalaの関数は、FunctionN
のいずれかの特性を実装するオブジェクトです。例:by-nameパラメータを取る関数を表すFunctionN特性とは何ですか?
scala> def f(x: Int) = x * x
f: (x: Int)Int
scala> val ff = f _
ff: Int => Int = <function1>
scala> val fff: Function1[Int, Int] = f _
fff: Int => Int = <function1>
これまでのところ、とても良いです。しかし、名前によるパラメータを取る関数があればどうでしょうか?それは確かにまだFunctionN
特徴の一つを実装ん:
scala> def g(x: => Int) = x * x
g: (x: => Int)Int
scala> val gg = g _
gg: => Int => Int = <function1>
scala> gg.isInstanceOf[Function1[_, _]]
res0: Boolean = true
しかし、どのようなタイプは、それがまさに、ありますか?
scala> val ggg: Function1[Int, Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required: Int => Int
val ggg: Function1[Int, Int] = g _
^
また、それはFunction1[Function0[Int], Int]
次のとおりです:それはFunction1[Int, Int]
ではありません
scala> val ggg: Function1[Function0[Int], Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required:() => Int => Int
val ggg: Function1[Function0[Int], Int] = g _
^
そしてFunction1[=> Int, Int]
はコンパイルに失敗します。
scala> val ggg: Function1[=> Int, Int] = g _
<console>:1: error: identifier expected but '=>' found.
val ggg: Function1[=> Int, Int] = g _
^
だから、それは何ですか?
確かに - 私はそれがボンネットの下で起こっていることは間違いありません。しかし、関数の型を推定するのではなく、関数の型を指定したいのであれば、それは何ですか?確かに、私がその型を書くことができないものを作ることはできないでしょうか?それをできる?! –
私はあなたがそれを行うことができるか分からない。すなわち、実際には、by-name引数に対応する 'type'が存在します。例えば。 'gg.getClass.getMethods.find(_。getName ==" apply ")。get'は、引数型の' Function0'を返します。しかし*コンパイラ*の場合、この変換はまだ行われていないので、 'Function0'が必要な型ではないことを伝えます(あなたの前回の試行前)。 –