0

「ScalainDepth」には、メソッドに渡された引数に対してscalaがある程度の推論を行う方法を著者が説明している例があります。例として、以下を示します。

def myMethod(functionLiteral: A => B):Unit
myMethod({ arg:A => new B})
myMethod({ arg => new B})

著者が何について話しているのかを理解するために、REPLで次のことを行います。

def myMethod(functionLiteral: Boolean => Boolean):Unit = {}
myMethod({a:Boolean => true})
myMethod({a => true})

ここで発生する唯一の明らかなことは、コンパイラーがエラーをスローしないことです。

著者は、関数の引数aがコンパイラによってブール値であると推測されていると言おうとしていますか?

4

2 に答える 2

2

はい、作者はaBooleanタイプmyMethod({a => true})Boolean => Boolean

==最初のビットをコンパイルするが、ポイントを少し逃す元の答え==

で入力する必要がありました[A,B]

def myMethod[A,B](functionLiteral: A => B): Unit = {}
myMethod((arg:String) => arg.length)
myMethod((arg:Int) => (1 to arg).map(_ *2))

関数を返すように変更して、replで型を確認できるようにしました。

scala> def myMethod[A,B](functionLiteral: A => B): A => B = functionLiteral
myMethod: [A, B](functionLiteral: (A) => B)(A) => B

scala> myMethod((arg:String) => arg.length)
res11: (String) => Int = <function1>

scala> res11("hello world!")
res12: Int = 12

scala> myMethod((arg:Int) => (1 to arg).map(_ *2))
res13: (Int) => scala.collection.immutable.IndexedSeq[Int] = <function1>

scala> res13(4)
res14: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
于 2012-11-16T04:32:33.943 に答える
2

著者は、関数の引数aがコンパイラによってブール値であると推測されていると言おうとしていますか?

絶対。次の方法が与えられます:

def myMethod(functionLiteral: Boolean => Boolean):Unit = {}

コンパイラーは、パラメーターtomyMethodがブールパラメーターを受け取る関数であることを認識しているため、指定する必要はありません。言い換えると、以下aは明確にブールパラメータです。

myMethod{a => true}

ここで、オーバーロードと混合すると、これは機能しなくなることに注意してください。

def myMethod(functionLiteral: Boolean => Boolean):Unit = {}
def myMethod(functionLiteral: Int => Boolean):Unit = {}
myMethod{a => true} // error: missing parameter type

その理由は、aがタイプであるBooleanか。であるかを明確に判断できないためですInt

于 2012-11-16T10:24:19.317 に答える