Scala之旅(TOUR OF SCALA)——多重参数列表(柯里化)(MULTIPLE PARAMETER LISTS(CURRYING))

方法可以定义多重参数列表。当一个方法被调用时仅传入一部分参数时将会产生一个由剩下参数列表作为参数的方法。我们通常叫它——柯里化。

这里有一个例子,在 Scala 的集合库中定义的一个可遍历化特征(Traversable trait)中的一个方法:

def foldLeft[B](z: B)(op: (B, A) => B): B

foldLeft 方法使用一个二元操作符(匿名函数) op 去操作传入的初始化值 z 和实现了这个的特征的集合中的所有元素,将每一个元素中的值与 z 进行操作,然后将结果放入 z 中,所有元素的遍历方向为从左到右。下面的例子说明了它的用法。

使用初始值 0 开始,foldLeft 方法使用匿名函数 (m, n) => m + n 去操作遍历在集合列表中的每一个元素,将它累加在之前的初始值中并返回。

val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.foldLeft(0)((m, n) => m + n)
print(res) // 55

多重列表列表有一个更加详细的调用语法,所以它应该被谨慎地使用。建议的使用场景包括:

单个函数参数(SINGLE FUNCTIONAL PARAMETER)

在单个函数作为参数的情况中,比如,像上面例子中的 foldLeft 方法中的 op 参数。多重参数列表在需要一个匿名函数作为参数时允许一种更简洁的语法。在没有使用多重参数列表时,代码可以像下面这样:

numbers.foldLeft(0, {(m: Int, n: Int) => m + n})

使用多重参数列表也允许我们利用 Scala 中的类型推断使代码像下面那样更加简洁,不能用在非柯里化的方法中。

numbers.foldLeft(0)(_ + _)

而且,它还允许我们首先只传入一个参数 z 然后返回一个由剩下的参数作为参数的函数,就像下面:

val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val numberFunc = numbers.foldLeft(List[Int]())_

val squares = numberFunc((xs, x) => xs:+ x*x)
print(squares.toString()) // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

val cubes = numberFunc((xs, x) => xs:+ x*x*x)
print(cubes.toString())  // List(1, 8, 27, 64, 125, 216, 343, 512, 729, 1000)

隐含参数(IMPLICIT PARAMETERS)

在多重参数列表中指定某些参数为 implicit ,多重参数列表就可以像下面一样被使用 [5]:

def execute(arg: Int)(implicit ec: ExecutionContext) = ???
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala函数是一等公民,可以作为参数传递和返回值。Scala也支持许多高级函数特性,包括柯里化函数和隐式函数。 1. 柯里化函数 柯里化函数是将多个参数函数转换成一系列单参数函数的过程。例如,一个接受两个参数函数可以被柯里化为两个单参数函数。 ```scala def add(x: Int, y: Int) = x + y // 柯里化函数 def addCurried(x: Int)(y: Int) = x + y ``` 在柯里化函数,每个参数都是一个单独的函数参数列表。这样做有助于提高代码的可读性和重用性。 2. 隐式函数 隐式函数是一种特殊类型的函数,它可以将一个类型转换为另一个类型。这种转换是在编译时自动完成的,而不需要显式调用函数。 ```scala // 定义一个隐式函数将Int类型转换成String类型 implicit def intToString(i: Int): String = i.toString // 使用隐式函数将Int类型转换成String类型 val s: String = 42 ``` 在上面的例子,当将一个Int类型的值赋给一个String类型的变量时,编译器会自动调用intToString函数,将Int类型转换成String类型。 除了类型转换,隐式函数还可以用于隐式参数和隐式类。隐式参数是一种特殊类型的函数参数,它可以在函数调用时自动提供。隐式类是一种特殊类型的类,它可以在需要时自动转换成其他类型。 Scala函数是非常强大和灵活的,柯里化函数和隐式函数是其两个重要的特性。它们可以提高代码的可读性、重用性和灵活性,使程序开发更加高效和简洁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值