匿名Scala函数语法
我正在学习更多关于
Scala的内容,而且我对这个匿名函数的例子有点麻烦,我已经复制了下面的整个代码块:
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) modN(n:Int)(x:Int)的语法是什么意思? 因为它被调用一个参数,我假设他们不是两个参数,但我不能真正弄清楚如何使用mod函数的num值. 解决方法
这是一个名为
currying的功能编程中的一个有趣的事情.基本上,MosesSch?nfinkel和后者Haskell Curry(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)用参数3调用新产生的函数g,因此按照预期计算为5. 另一种查看方式是通过逐步减少(功能性程序员称之为β减少 – 它就像逐步的逐行步进)的功能(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 所以,在所有的这个谈话之后,f(x)(y)可以被看作以下的lambda表达式(x:Int)=> {(y:Int)=> x y} – 这是有效的Scala. 我希望这一切都有意义 – 我试图给出一点为什么modN(3)调用有意义的背景:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |