scala中的函数

时间:2014-10-23 04:16:56

标签: function scala

我很难理解以下scala中的含义:

f: Int => Int

是一个功能吗? f: Int => Intdef f(Int => Int)之间有什么区别?

由于

3 个答案:

答案 0 :(得分:2)

假设f: Int => Intval f: Int => Int的拼写错误, 而def f(Int => Int)def f(i: Int): Int的拼写错误。

val f: Int => Int表示值fFunction1[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是一种方法,而不是一种功能 但值gFunction1[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是一个高阶函数,我们定义了三个调用它的函数,传递不同的匿名函数来进行不同类型的匹配。

希望有所帮助。