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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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. [SHOI2008]cactus仙人掌图

    [题目描述] 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例 ...

  2. codeforces 523D tatistics of Recompressing Videos

    一个称为DH(DogHouse)的狗的社交网络有k台专用服务器来重新上传可爱的猫的上传视频.每个视频上传后,应该在一个(任何)服务器上重新压缩,之后才可以保存在社交网络中. 我们知道每个服务器需要一秒 ...

  3. 【USACO】干草金字塔

    题目描述 贝西要用干草包堆出一座金字塔.干草包会从传送带上陆续运来,依次出现 N 包,每包干草可 以看做是一个二维平面上的一个长方形,第 i 包干草的宽度是 W i ,长度统一为 1. 金字塔的修建有 ...

  4. [USACO 5.1.3]乐曲主题

    Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的 ...

  5. 【SYZOI Round1】滑稽的树

    Description zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到.虽然我们看不到,但是还是知道一些信息: 这真的是一棵树,由n个节点,n-1条边联通.一号滑稽果同时 ...

  6. 《Java技术》第一次作业——Java语言基础

    学习总结 Scanner类实现基本数据输入的方法 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配.然后可以使用不同的 next 方法将得到的标记转换为不同类型的值. ...

  7. TensorFlow 聊天机器人开源项目评测第一期:DeepQA

    聊天机器人开源项目评测第一期:DeepQA https://github.com/Conchylicultor/DeepQA 用 i5 的笔记本早上运行到下午,跑了 3 轮的结果,最后效果并不理想.官 ...

  8. git pull 报错 You have not concluded your merge (MERGE_HEAD exists).

    git pull时报错 解决方案:

  9. TypeScript: Week Reflection

    TypeScript: Week Reflection Introduction Type Script already provide decorators to help developers i ...

  10. php中AJAX请求中使用post和get请求的区别

    之前使用这两个请求的时候,主要从几个方面考虑: 1.语义,get就是从服务器获取,一般就是获取/查询资源信息.post就是提交给服务器,一般就是更新资源信息. 2.请求文件大小,get一般只有2k这样 ...