currying 是函数式语言中经常遇到的一个概念，翻译成 柯里化，不是库里化。

currying 指的是将接收多个参数的函数变换成接收一个单一参数，并且返回接收余下的参数而且返回结果的新函数的技术。

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

//call add
add(1, 2)
add(3, 4)
``````

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

``````    add(1)(2)
add(3)(4)
``````

scala 对于这种写法提供了语法糖，add 的 currying 写法我们可以更简单地写为：

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

``````    def curry[A, B, C](f: (A, B) => C): A => (B => C) = a => b => f(a, b)
``````

``````    def uncurry[A, B, C](f: A => B => C): (A, B) => C =
(a, b) => f(a)(b)
``````

``````    def add(x: Int, y: Int): Int = x + y
def add1(y: Int): Int = add(1, y)
``````

``````    add1(5) //6
``````

``````int foo(int a, int b, int c) {
return a + b + c;
}

int foo23(int a, int c) {
return foo(a, 23, c);
}
``````

``````def sum(f: Int => Int, a: Int, b: Int): Int =
if(a > b) 0
else f(a) + sum(a+1, b)
``````

``````    sum(x => x * x, 1, 10)
``````

``````def sum(f: Int => Int)(a: Int, b: Int): Int =
if(a >b) 0 else f(a) + sum(f)(a+1, b)
``````

``````def sumT(f: Int => Int): (Int, Int) => Int = {
def sumF(a: Int, b: Int): Int =
if(a > b) 0
else f(a) + sumF(a+1, b)
sumF
}
``````

``````def sum3 = sum(x => x * x * x)  //三次方
def sum4 = sum(x => x * x * x * x)  //四次方
``````

``````using (new File(name), f => {......})
``````

``````using(new File(name)){ f => ......}
``````

``````def f(arg1)(arg2)......(argn) => E
//等同于
def f(arg1)(arg2)......(argn-1) => { def g(argn) => E; g}
/.更简单点
def f(arg1)(arg2)......(argn-1) => (argsn => E)
//继续最后就可以写成
def f = args1 => args2......=>argsn => E
``````

``````def dropWhile[A](as: List[A], f: A => Boolean): List[A] = ......
//调用
dropWhile(List(1,2,3,4), (x: Int => x < 4))

//currying之后
dropWhile[A](as:List[A])(f: A => Boolean): List[A] = ......
//调用
dropWhile(List(1,2,3,4))(x => x < 4)  //这里不再需要指明 x 的类型
``````

currying 也可以在某些只允许使用单个参数的函数的情景下发挥作用，利用 currying 使用层层嵌套的单参数函数，可以实现语法层面的多参数函数。

## 函数式中的 currying的更多相关文章

1. 函数式编程之-Currying

这个系列涉及到了F#这门语言,也许有的人觉得这样的语言遥不可及,的确我几乎花了2-3年的时间去了解他:也许有人觉得学习这样的冷门语言没有必要,我也赞同,那么我为什么要花时间去学习呢?作为一门在Tiob ...

2. 函数式编程之-定义能够支持Partial application的函数

是时候介绍如何在F#中定义函数了,在你没有接触过函数式编程语言之前,你也许会觉得C#/Java的语法已经够丰富了,有什么任务做不了呢?当你读过函数式编程之Currying和函数式编程之Partial ...

3. Vim中的正则表达式[转]

来自:http://blog.csdn.net/endall/archive/2007/08/29/1764554.aspx Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操 ...

4. VIM中的正则表达式及替换命令

VIM中的正则表达式及替换命令 一.使用正则表达式的命令 使用正则表达式的命令最常见的就是 / (搜索)命令.其格式如下: /正则表达式 另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正 ...

5. Excel自动从身份证中提取生日、性别、年龄

现在学生的身份证号已经全部都是18位的新一代身份证了,里面的数字都是有规律的.前6位数字是户籍所在地的代码,7-14位就是出生日期.第17位“2”代表的是性别,偶数为女性,奇数为男性.我们要做的就是把 ...

6. vim中使用正則表達式

一.使用正則表達式的命令 使用正則表達式的命令最常见的就是 / (搜索)命令. 其格式例如以下: /正則表達式 还有一个非常实用的命令就是 :s(替换)命令,将第一个//之间的正則表達式替换成第二个/ ...

7. Scala函数式编程（四）函数式的数据结构 上

这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...

8. Reactor3 中文文档（用户手册）

文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

9. JS 柯里化 (curry)

用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...

## 随机推荐

1. 16. javacript高级程序设计-HTML5脚本编程

1. HTML5脚本编程 l 跨文档消息传递API能够让我们在不降低同源策略安全性的前提下,在来至不同的域的文档间传递消息 l 原生拖放功能可以方便的指定某个元素是否可以拖动,并在放置时做出响应.还可 ...

2. C# 远程网络唤醒介绍及代码

一.定义 网络唤醒:唤醒休眠状态下的计算机,而不是已关机的计算机. 优势:可通过定时功能实现自动唤醒计算机,减少人力使用. 实现方法:通过被唤醒机的MAC地址进行广播发送请求,唤醒计算机. 二.硬件设 ...

3. 什么是blob,mysql blob大小配置介绍

什么是blob,mysql blob大小配置介绍 作者: 字体:[增加 减小] 类型:转载   BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器.在计 ...

4. C++ 11 笔记 （四） ： std::bind

std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hel ...

5. Redis事务和分布式锁

Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...

6. 【PLSQL】绑定变量，活跃SQL，软硬解析解析

************************************************************************   ****原文:blog.csdn.net/clar ...

7. linux 下修改 apache 启动的所属用户和组

apache默认启动的用户和组是www-data,所以有些时候,就会涉及到权限问题,没有权限在执行目录下创建或者读写文件.改变用户和组的方法其实很简单: 1.进入到apache默认安装路径/etc/a ...

8. hdu4758 Walk Through Squares (AC自己主动机+DP)

Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...

9. HDU 5776 sum

猜了一下,发现对了.n>m是一定有解的.所以最多m*m暴力,一定能找到.而T较小,所以能过. #pragma comment(linker, "/STACK:1024000000,10 ...

10. EasyUI 分页 简洁代码

做分页代码,看到网上很多人实现的方法,那是各种调用,各种获取对象.我很不解,因为Easyui已经给我们了分页的具体实现,为什么有些人要画蛇添足呢. 其实真正的分页,在你的代码中,别人可能都没有注意到, ...