匿名斯卡拉函数的语法(Anonymous Scala function syntax)

2019-07-22 01:06发布

我正在学习更多关于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)))
}

我很困惑与MODN功能的应用

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

在这个例子中,它用一个参数调用

modN(2) and modN(3)

是什么MOD​​N的语法(N为:int)(X:智力)是什么意思?

因为它是用一个参数调用,我假设他们不是两个参数,但我真的不能计算出从NUMS值如何习惯于通过MOD功能。

Answer 1:

这是函数式编程一个有趣的东西叫做钻营 。 基本上摩西·施菲克尔和后者哈斯克尔库里(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)调用新产生的功能g用参数3 ,因此计算到5 ,如所预期。

以查看它的另一种方式是通过减少步进(功能程序员调用这个beta还原-就像一行踩着线的功能性的方式)的的f(2)(3)电话(注意,下面是不是真的有效。斯卡拉语法)。

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

所以,毕竟这谈话, f(x)(y)可以被视为只是以下lambda表达式(x: Int) => {(y: Int) => x + y} -这是有效的Scala。

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



Answer 2:

您在部分应用MODN功能。 部分函数应用是函数式语言的主要特征之一。 欲了解更多信息,请查看这些文章柯里和Pointfree风格。



Answer 3:

在这个例子中,MODN 返回由特定N.这样可以节省你不必这样做MODS的功能:

def mod2(x:Int): Boolean = (x%2) == 0
def mod3(x:Int): Boolean = (x%3) == 0

两对括号的划定,您可以停止传递参数的方法。 当然,你也可以只用一个占位符来实现同样的事情,即使方法只有一个参数列表。

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

val nums = List(1, 2, 3, 4, 5)
println(nums.filter(modN(2, _)))
println(nums.filter(modN(3, _)))


文章来源: Anonymous Scala function syntax