Scala 闭包
2018-01-15 21:17 更新
Scala闭包
闭包是一个函数,它的返回值取决于在该函数之外声明的一个或多个变量的值。
例子
让我们创建一个乘法器函数如图所示:
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)
以上内容是否对您有帮助:
更多建议: