Swift函数柯里化(Currying)简谈

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift函数柯里化(Currying)简谈相关的知识,希望对你有一定的参考价值。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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)简谈的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程———柯里化(Currying)

JavaScript函数的柯里化(currying)

1.前端 函数柯里化(currying)

函数柯里化(Currying)小实践

js - 函数的柯里化(Currying)

js - 函数的柯里化(Currying)