匿名Scala函数语法

Jef*_*rey 14 syntax scala anonymous-function

我正在学习更多关于Scala的知识,而且我在http://www.scala-lang.org/node/135中理解匿名函数的例子时遇到了一些麻烦.我已经复制了下面的整个代码块:

object CurryTest extends Application {
    def filter(xs: List[Int], p: Int => Boolean): List[Int] =
        if (xs.isEmpty) xs
        else if (p(xs.head)) xs.head :: filter(xs.tail, p)
        else filter(xs.tail, p)

    def modN(n: Int)(x: Int) = ((x % n) == 0)

    val nums = List(1, 2, 3, 4, 5, 6, 7, 8)
    println(filter(nums, modN(2)))
    println(filter(nums, modN(3)))
}
Run Code Online (Sandbox Code Playgroud)

我对modN功能的应用感到困惑

def modN(n: Int)(x: Int) = ((x % n) == 0)
Run Code Online (Sandbox Code Playgroud)

在示例中,使用一个参数调用它

modN(2) and modN(3)
Run Code Online (Sandbox Code Playgroud)

modN(n:Int)(x:Int)的语法是什么意思?

因为它是用一个参数调用的,所以我假设它们不是两个参数,但我无法弄清楚mod函数如何使用nums的值.

Fla*_*gan 46

这在称为currying的函数式编程中是一件有趣的事情.基本上摩西·施菲克尔和后者哈斯克尔库里(Schonfinkeling会听起来不可思议,但...)想出了一个主意,调用多个参数的函数,说f(x,y)是一样的调用链{g(x)}(y)g(x)(y)哪里g是产生另一个函数作为它的一个功能输出.

举个例子,采取这个功能f(x: Int, y: Int) = x + y.正如预期的那样,召唤f(2,3)会产生5.但是当我们讨论这个函数时会发生什么 - 将它重新定义为f(x:Int)(y: Int)并将其称为f(2)(3).第一个调用,f(2)生成一个取整数y并添加2到它的函数- >因此f(2)具有类型Int => Int并且等效于该函数g(y) = 2 + y.第二个调用使用参数f(2)(3)调用新生成的函数,因此按预期进行评估.g35

查看它的另一种方法是逐步执行缩减(函数式程序员称之为beta-reduction - 它就像逐行逐步执行的功能方式)f(2)(3)(注意,以下内容并非真正有效的Scala语法).

f(2)(3)         // Same as x => {y => x + y}
 | 
{y => 2 + y}(3) // The x in f gets replaced by 2
       |
     2 + 3      // The y gets replaced by 3
       |
       5
Run Code Online (Sandbox Code Playgroud)

因此,在所有这些讨论之后,f(x)(y)可以将其视为以下lambda表达式(x: Int) => {(y: Int) => x + y}- 这是有效的Scala.

我希望这一切是有道理的-我想给一点背景的,为什么modN(3)呼叫有道理:)