繁体   English   中英

“推断函数中使用的类型是文字”吗?

[英]“Infer the types used in a function are literals”?

在“深度缩放”中有一个示例,作者在其中说明了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推断为布尔值?

是笔者说,不需要指定aBooleanmyMethod({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)

作者是否要说编译器将函数参数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

原因是它无法明确判断aBoolean还是Int类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM