“Scala in Depth”中有一个例子,作者正在解释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推断为布尔值?
答案 0 :(得分:2)
是的,作者说不需要在a
中指定Boolean
是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)
答案 1 :(得分:2)
作者是否试图说编译器将函数参数a推断为布尔值?
绝对。 给出以下方法:
def myMethod(functionLiteral: Boolean => Boolean):Unit = {}
编译器知道myMethod
的参数是一个采用布尔参数的函数,因此不需要您指定它。换句话说,在下面的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
。