大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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)

Swift函数柯里化(Currying)简谈的更多相关文章

  1. 函数柯里化(Currying)示例

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...

  2. 前端开发者进阶之函数柯里化Currying

    穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接 ...

  3. 偏函数应用(Partial Application)和函数柯里化(Currying)

    偏函数应用指的是固化函数的一个或一些参数,从而产生一个新的函数.比如我们有一个记录日志的函数: 1: def log(level, message): 2: print level + ": ...

  4. 应用js函数柯里化currying 与ajax 局部刷新dom

    直接上代码吧 最近读javascript核心概念及实践的代码 感觉很有用 备忘. <div id="request"></div> <script t ...

  5. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  6. 深入理解javascript函数进阶系列第二篇——函数柯里化

    前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...

  7. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  8. JS 浅谈函数柯里化,不明觉厉

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

  9. 函数柯里化(Currying)小实践

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

随机推荐

  1. [Codeforces 933A]A Twisty Movement

    Description 题库链接 给你一个长度为 \(n\) 的只含有 \(1,2\) 的序列.你可以选择其中的一段 \([l,r]\) ,将区间翻转,翻转后使得单调不下降序列最长.求最长长度. \( ...

  2. NOIP 2015

    Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...

  3. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  4. SPOJ PHRASES 每个字符串至少出现两次且不重叠的最长子串

    Description You are the King of Byteland. Your agents have just intercepted a batch of encrypted ene ...

  5. hihocoder1258(水)(2015ACM/ICPC北京站)

    题意: 给你B,C,S三种模式,当出现S时直接得分最多300(即perfect) 当是B,C时后面会跟一个数字,当后面的数字是从1开始的连续时,直接得分最多300(即perfect) 问给你一系列,最 ...

  6. 勤拂拭软件Android开发之旅(1) 之 Android 开发环境搭建

    勤拂拭软件工作室原创出品,欢迎转载,欢迎交流. 转载请注明原文:http://www.cnblogs.com/wangleiblog/p/6019063.html 勤拂拭软件Android开发之旅目录 ...

  7. (转)SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  8. js 在iframe子页面获取父页面元素,或在父页面 获取iframe子页面的元素的几种方式

    用JS或jquery访问页面内的iframe,兼容IE/FF 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe: XML/HTML代码 ...

  9. React学习笔记(一)- 环境搭建

    最近在学习react相关的知识,刚刚起步,一路遇坑不断.自己做个笔记,方便日后总结,也供相同趣味的小伙伴一起交流探讨. 学习时主要参考官网的教程:https://facebook.github.io/ ...

  10. diango-团队介绍

    1.使用django-admin startproject show创建项目,并使用python manage.py startapp team_show创建应用 2.进行相关的配置 3.代码的实现