我很难理解以下scala中的含义:
f: Int => Int
是一个功能吗?
f: Int => Int
和def f(Int => Int)
之间有什么区别?
由于
答案 0 :(得分:2)
假设f: Int => Int
是val f: Int => Int
的拼写错误,
而def f(Int => Int)
是def f(i: Int): Int
的拼写错误。
val f: Int => Int
表示值f
为Function1[Int, Int]
。
首先,A => B
等于=>[A, B]
这只是一个快捷方式,例如:
trait Foo[A, B]
val foo: Int Foo String // = Foo[Int, String]
其次,=>[A, B]
等于Function1[A, B]
这被称为"类型别名",定义如下:
type ~>[A, B] = Foo[A, B]
val foo: Int ~> String // = Foo[Int, String]
def f(i: Int): Int
是一种方法,而不是一种功能
但值g
为Function1[Int, Int]
,其中val g = f _
已定义。
答案 1 :(得分:1)
f: Int => Int
表示f
的类型为Int => Int
。
现在是什么意思?这意味着f
是一个获得Int
并返回Int
的函数。
您可以使用
定义此类功能def f(i: Int): Int = i * 2
或
def f: Int => Int = i => i * 2
甚至
def f: Int => Int = _ * 2
_
是用于指定参数的占位符。在这种情况下,参数的类型已在Int => Int
中定义,因此编译器知道此_
的类型是什么。
以下再次等同于上述定义:
def f = (i:Int) => i * 2
在所有情况下,f
的类型都是Int => Int
。
那箭是什么? 如果在类型位置看到此箭头(即需要类型的位置),则指定一个函数。
例如在
中val func: String => String
但如果你在anonymous function中看到这个箭头,它会将参数与函数体分开。例如在
中i => i * 2
答案 2 :(得分:0)
稍微详细说明Nader的回答,f:Int => Int将经常出现在高阶函数的参数列表中,所以
def myHighOrderFunction(f : Int => Int) : String = {
// ...
"Hi"
}
是一个 dumb 高阶函数,但是显示你如何说myOrderFunction作为参数f,这是一个将int映射到int的函数。
所以我可以合法地称它为例如:
myHighOrderFunction(_ * 2)
一个更具说明性的例子来自Odersky的Scala编程:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
private def filesMatching(matcher: String => Boolean) =
for (file <- filesHere if matcher(file.getName))
yield file
def filesEnding(query: String) = filesMatching(_.endsWith(query))
def filesContaining(query: String) = filesMatching(_.contains(query))
def filesRegex(query: String) = filesMatching(_.matches(query))
}
这里filesMatching是一个高阶函数,我们定义了三个调用它的函数,传递不同的匿名函数来进行不同类型的匹配。
希望有所帮助。