Swift函数柯里化(Currying)简谈
2016-04-04 13:22
489 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多个参数的函数划分为若干个”嵌套”的单一参数的函数.
这样说谁也听不懂,我们结合一个例子给大家简单说说.
我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;)
首先是蜘蛛的类:
因为我们不希望直接创建大蜘蛛,所以需要一个返回函数的函数:
貌似还不错,但是上述方法把蜘蛛的腿限制在8只,这可不太好,所以我们做些调整:
我们可以适当简化一下函数:
你会说这个函数不算漂亮,因为后面拖着两个->尾巴,的确!这样不仅不优雅而且容易把新手绕晕,于是我们把函数摇身一变:柯里化思密达:
我们这样调用:
注意,以上函数的写法貌似返回类型是Spider,其实不然!它仍然返回一个函数!证明给你看:
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多个参数的函数划分为若干个”嵌套”的单一参数的函数.
这样说谁也听不懂,我们结合一个例子给大家简单说说.
我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;)
首先是蜘蛛的类:
class Spider:CustomStringConvertible { let name:String let leg:Int var description:String{ return "蜘蛛(\(name) leg:\(leg))" } init(name:String,leg:Int){ self.name = name self.leg = leg } }
因为我们不希望直接创建大蜘蛛,所以需要一个返回函数的函数:
func createSpawnSpiderFunc(name:String)->()->Spider{ func spwanSpider()->Spider{ return Spider(name: name, leg: 8) } return spwanSpider } let x = createSpawnSpiderFunc("BigSpider") let spider = x() //蜘蛛(BigSpider leg:8)
貌似还不错,但是上述方法把蜘蛛的腿限制在8只,这可不太好,所以我们做些调整:
func createSpawnSpiderFunc2(name:String)->(Int)->Spider{ func spwanSpider(leg:Int)->Spider{ return Spider(name: name, leg: leg) } return spwanSpider } let y = createSpawnSpiderFunc2("XLegSpider") let spiderXLeg = y(16) //蜘蛛(XLegSpider leg:16)
我们可以适当简化一下函数:
func createSpawnSpiderFunc3(name:String)->(Int)->Spider{ return {leg in return Spider(name: name, leg: leg) } }
你会说这个函数不算漂亮,因为后面拖着两个->尾巴,的确!这样不仅不优雅而且容易把新手绕晕,于是我们把函数摇身一变:柯里化思密达:
func createSpawnSpiderFuncCurry(name:String)(leg:Int)->Spider{ return Spider(name: name, leg: leg) }
我们这样调用:
let 蜘蛛 = createSpawnSpiderFuncCurry("大蜘蛛")(leg: 121) //蜘蛛(大蜘蛛 leg:121)
注意,以上函数的写法貌似返回类型是Spider,其实不然!它仍然返回一个函数!证明给你看:
let 创建超级大蜘蛛 = createSpawnSpiderFuncCurry("超级大蜘蛛") let 超级大蜘蛛 = 创建超级大蜘蛛(leg: 100000) //蜘蛛(超级大蜘蛛 leg:100000)
相关文章推荐
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究