Scala——函数Currying

来源:互联网 发布:淘宝藏族舞蹈头饰 编辑:程序博客网 时间:2024/05/21 20:41

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

简单的Currying函数用法:

def currying(x: Int)(y: Int) = x + yval tmp = currying(1)_tmp(2)3

官方给出的例子如下:

object CurryTest extends App {    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)))}

结果为:
List(2,4,6,8)
List(3,6)

本例详细解读:
定义Curring函数modN,
参数n,Int类型;
参数x,Int类型。
返回值:boolean
函数作用为判断x是否能被n整除。

定义函数filter,
参数(1)一个整数线性表
参数(2)一个参数为Int类型返回值Boolean的函数
返回值:一个整数线性表
函数体:
(1)表xs为空则直接返回表
(2)如果当前表的第一个值能被Currying函数p的n整除,那么返回“这个值+余下部分处理的结果表”( :: 一种运算符重载,代表连接的意思)
(3)如果不能被整除,返回余下部分处理的结果表
通俗一点就是能整除则留下,不能整除则丢掉。

调用函数:
定义一个整数线性表:val nums = List(1, 2, 3, 4, 5, 6, 7, 8)
filter(nums, modN(2)):这句话的意思是先传参数2,当作modN函数中的n值。再将余下的函数(x % 2 ==0)传给filter函数作为参数。(modN(2)也可以写成modN(2)_,这样能直观的看出这是个Currying函数)
filter(nums, modN(3)):这句话的意思是先传参数3,当作modN函数中的n值。再将余下的函数(x % 3 ==0)传给filter函数作为参数。

所以结果为:
List(2,4,6,8)
List(3,6)

0 0