Scala——函数Currying

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

简单的Currying函数用法:

def currying(x: Int)(y: Int) = x + y
val 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值