Scala 闭包

2022-05-13 15:16 更新

闭包是一个函数,它的返回值取决于在该函数之外声明的一个或多个变量的值。

例子

让我们创建一个乘法器函数如图所示:

var y = 3
val multiplier = (x:Int) => x * y

现在,y具有对函数外部的变量的引用,但是在包围范围中。

object Main extends App { 
    var y = 3
    val multiplier = (x:Int) => x * y
    println(multiplier(3))
} 

部分应用功能

在函数式编程语言中,调用带有参数的函数是将函数应用于参数。

当所有参数都传递给函数时,我们将函数完全应用于所有参数。

一个简单的添加函数:

val add = (x: Int, y: Int) => x + y
add(1,2)

但是当我们只给函数一个子集的参数,表达式的结果是一个部分应用的函数。

val partiallyAdd = add(1, _:Int)

因为我们没有为第二个参数提供值,所以变量部分Add是一个部分应用的函数。

当给予 partiallyAdd 一个Int值2时,你得到传递到add和partiallyAdd函数的Int数的总和:

partiallyAdd(2)

当我们提供所有参数时,执行原始函数,产生结果。

Curried函数

Currying转换具有多个参数的函数,创建一个函数链,每个函数都需要一个参数。

下面的代码创建了添加两个Int参数a和b的add函数,如下所示:

val add = (x: Int, y: Int) => x + y
add(3,3)

在Scala中,curried函数使用多个参数列表定义,如下所示:

def add(x: Int)(y: Int) = x + y

我们还可以使用以下语法定义curried函数:

def add(x: Int) = (y: Int) => x + y

而不是两个Int参数的一个列表,您应用curry add函数到一个Int参数的两个列表。

因此curry add函数看起来像这样:

def curriedAdd(a: Int)(b: Int) = a + b
curriedAdd(2)(2)
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号