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)呼叫有道理:)