加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

匿名Scala函数语法

发布时间:2020-12-16 09:16:50 所属栏目:安全 来源:网络整理
导读:我正在学习更多关于 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
我正在学习更多关于 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)调用有意义的背景:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读