Function Currying
2016年06月26日 Swift

函数柯里化

前几天Swift发布3.0预览版,改动的还不小,不兼容Swift2.2,加了诸多特性,也去掉了不少语法,看到的第一个就是在Swift3.0里去掉了Function Currying(函数柯里化)的语法声明形式,具体可以看这里。之前从来没有了解过这个术语,只知道大致的意思,这里记录一下。

概念

函数柯里化是计算机科学里的术语,简单的说就是把一个接受多个参数的函数转换为接受一个参数的函数,并且返回一个这样的函数,这个函数接受剩下没有处理的参数且把最终结果返回。具体可参照Wiki的解释。

为什么要使用函数柯里化

函数式编程的思想,把函数变成”一个输入一个输出”的单个小片段,从而可以更好的与其他接口组合出更强大的功能,整个过程也更易理解,看起来就是把一大堆复杂的东西,”一步一步的”构造出来,而这中间的过程都是单一的可组合的,更加灵活的。至于为什么Swift3.0会去掉函数柯里化的语法,SE-0002提案给出的解释是在Swift里柯里化的功能有限,且增加了语言实现的复杂度。

Example

Lua中实现类似的函数柯里化

1
2
3
4
5
6
7
8
9
function currying_test(fir)
return function(sec)
return function(thr)
return fir * sec * thr
end
end
end

print(currying_test(2)(3)(4)) -- 输出24

Python中也是类似,不过Python中的functiontools包中还有partial,可以组合出类似的功能。通过固定某些参数的值,组合出更灵活的返回函数完成更多功能。

Swift2.2中的函数柯里化

1
2
3
4
5
6
7
8
9
10
func curryingFunction(fir:Int)(_ sec:Int)(_ thr:Int) -> Int {
return fir + sec + thr
}
let addSec = curryingFunction(10)
let addThr = addSec(11)
let res = addThr(12)
print(res) // 输出33

// 也可以直接像上面lua那样直接调用
print(curryingFunction(10)(11)(12))

可能在实际项目中不会追根究底的去这样儿用,只求达到最终目的,或者是并没有理解到柯里化的真正精髓,但是多知道一些总是好的。

End记录