偏函数应用(Partial Application)和函数柯里化(Currying)
偏函数应用指的是固化函数的一个或一些参数,从而产生一个新的函数。比如我们有一个记录日志的函数:
1: def log(level, message):
2: print level + ": " + message
3:
4: #usage
5: log("Warning", "this is one warning message")
6: log("Error", "this is one error message")
在这个函数基础上我们可以固化level参数,产生新的具有特定意义的log函数:
1: def logWarning(message):
2: log("Warning", message)
3:
4: def logError(message):
5: log("Error", message)
6:
7: #usage
8: logWarning("this is one warning message")
9: logError("this is one error message")
这就叫偏函数应用。
在Python中可以借助functools模块来完成偏函数应用,而不用手工编写代码。
1: from functools import partial
2:
3: logWarning = partial(log, "Warning")
4:
5: #usage
6: logWarning("this is one warning message")
partial是一个高阶函数(参数含有函数类型,返回值也是函数类型),所以对于3个或更多参数的函数我们还可以这样用:
1: def log(level, message, stack):
2: print level + ": " + message
3: print stack
4:
5: logUnknownError = partial(partial(log, "Error"), "Unknown")
6: logUnkownError("stack content")
7:
8: #output
9: #Error: Unkown
10: #stack content
Currying指的是将一个具有多个参数的函数,转换成能够通过一系列的函数链式调用,其中每一个函数都只有一个参数。我们对log函数进行Currying:
1: def log(level):
2: def logMessage(message):
3: print level + ": " + message
4:
5: return logMessage
6:
7: #usage
8: log("Warning")("this is one warning message")
9:
10: #or like this
11: logError = log("Error")
12: logError("this is one error message")
对于curried函数是不能使用多参数的调用方式:
log(“warning”, “this is one warning message”)
这样会得到错误,因为log只接受一个参数。
偏函数和Currying看起来有点类似,区别是什么呢?偏函数是用特定的值来具体化参数,而Currying是变成了一条函数链。
1: from functools import partial
2:
3: def log(level, message, stack):
4: print level + ": " + message
5: print stack
6:
7: #partial application
8: partialLogWarning = partial(log, "Warning")
9:
10: #currying
11: def curriedLog(level):
12: def logMsg(message):
13: def logStack(stack):
14: print level + ": " + message
15: print stack
16:
17: return logStack
18:
19: return logMsg
20:
21: curriedLogWarning = curriedLog("Warning")
22:
23: #1. 偏函数后依然可以使用多参数,只要还有参数未固化;而Currying只能使用函数链
24: #work
25: partialLogWarning("message", "stack")
26: curriedLogWarning("message")("stack")
27:
28: #2. Currying得到简化的函数方式更自然,而偏函数必须借用高阶函数或手动生成
29: curriedLogError = curriedLog("Error")
30: curriedLogUnknownError = curriedLog("Error")("Unknown")
31: curriedLogUnknownError2 = curriedLogError("Unknown")
32:
33: partialLogError = partial(log, "Error")
34: partialLogUnknownError = partial(log, "Error", "Unknown")
35: partialLogUnknownError2 = partial(partial(log, "Error"), "Unknown")
偏函数和Currying有什么用?主要就是从能一个通用函数得到更特定的函数。有一些编程经验的,一定都手工写过偏函数应用吧。
Currying提供了另外一种实现方式。这种方式在函数式编程中更常见。函数式编程思想,不仅在Lisp这样的函数式编程语言中,在更多的语言中也得到了实现和发展,像Python,Javascript乃至C#这样的命令式语言(imperative language)。所以有机会不妨考虑下使用Currying,能否更好地解决问题。 https://www.cnblogs.com/cypine/p/3258552.html
偏函数应用(Partial Application)和函数柯里化(Currying)的更多相关文章
- 函数柯里化(Currying)示例
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...
- Swift函数柯里化(Currying)简谈
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多 ...
- 前端开发者进阶之函数柯里化Currying
穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接 ...
- 应用js函数柯里化currying 与ajax 局部刷新dom
直接上代码吧 最近读javascript核心概念及实践的代码 感觉很有用 备忘. <div id="request"></div> <script t ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- 深入理解javascript函数进阶系列第二篇——函数柯里化
前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...
- JS中的柯里化(currying)
何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...
- 函数柯里化与偏函数+bind
简单理解: 1,函数柯里化就是把多参数函数分解为多return的单参数函数: 举个例子(伪代码): function func (a, b, c){ return } 柯里化为 function fu ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
随机推荐
- [luoguP3275] [SCOI2011]糖果(差分约束)
传送门 差分约束裸题 但是坑! 有一个点是长为10W的链,需要逆序加边才能过(真是玄学) 还有各种坑爹数据 开longlong ——代码 #include <cstdio> #includ ...
- 清北学堂模拟赛d2t3 逆序对(pair)
题目描述LYK最近在研究逆序对.这个问题是这样的.一开始LYK有一个2^n长度的数组ai.LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设n=4,k=2,则a[1],a ...
- jQuery toast message 地址 使用
jQuery toast message 地址 使用 https://github.com/akquinet/jquery-toastmessage-plugin/wiki
- hadoop常见操作命令
1.查看指定文件夹下内容 hadoop dfs –ls [文件文件夹] eg: hadoop dfs –ls /user/wangkai.pt 2.打开某个已存在文件 hadoop dfs –cat ...
- Web Service学习-CXF开发Web Service的权限控制(二)
Web Service怎样进行权限控制? 解决思路:server端要求input消息总是携带实username.password信息,假设没实username和password信息.直接拒绝调用 解决 ...
- QPS计算
案例:公司xiaoyb性能测试评估 我们预估支持500家学校,每所学校300人,每天有10%的活跃率,每天有500*300*10%=15000人,每人每天平均请求20次,每天大概请求时间共8小时,80 ...
- IE6、IE7的兼容问题
通常,网页的兼容问题,就是IE6\IE7的问题.表现为错位.换行,不支持CSS3等. 而其中,错位.换行,原因往往在于没有指明元素的width.height. 一般银瓦不告诉他.
- How to Integrate .NET Projects with Jenkins
https://www.swtestacademy.com/jenkins-dotnet-integration/ 8) Unit Tests and Test Coverage Settings D ...
- poj1041 John's trip——字典序欧拉回路
题目:http://poj.org/problem?id=1041 求字典序欧拉回路: 首先,如果图是欧拉图,就一定存在欧拉回路,直接 dfs 即可,不用 return 判断什么的,否则TLE... ...
- SpringMVC中url映射到Controller
SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的[url-pattern]的规 ...