柯里化

作者: 冰三尺 | 来源:发表于2017-10-28 16:25 被阅读73次

    将一个接受多参数的函数变换为一系列只接受单个参数 的函数,这个过程被称为柯里化 (Currying),它得名于逻辑学家 Haskell Curry;我们将 add2 称为 add1 的柯里化版本。

    先定义一个计算两个数之和的函数

    func add1(x: Int, _ y: Int) -> Int {
          return x + y
     }
    

    add1 函数接受两个整型参数并返回它们的和。

    柯里化版本

        func add2(x:Int) -> ((Int) -> Int) {
            return { y in
                return x + y
            }
        }
    

    add2 函数接受第一个参数 x 之后,返回一个闭包,然后等待第二个参数 y。

    add1(1, 2)
    add2(1)(2)
    

    在第一种方法中,我们将两个参数同时传递给 add1;而第二种方法则首先向函数传递第一个参 数 1,然后将返回的函数应用到第二个参数 2。两个版本是完全等价的:我们可以根据 add2 来 定义 add1,反之亦然。

    在 Swift 中,我们甚至可以省略 add2 函数的一个 return 关键字和返回类型中的某些括号,然 后写为下面这样:

        func add3(x: Int) -> ((Int) -> Int) {
            return {
                y in
                x + y
            }
        }
    
    

    函数中的箭头 -> 向右结合。这也就是说,你可以将 A -> B -> C 理解为 A -> (B -> C)。你也可以为函数类型引入一个类型别名

    typealias closure = (Int) -> Int
    func add3(x: Int) -> closure {
            return {
                y in
                x + y
            }
        }
    

    add1 和 add2 的例子向我们展示了如何将一个接受多参数的函数变换为一系列只接受单个参数 的函数,这个过程被称为柯里化 (Currying)

    在一些情况下,你可 能想要将函数作为参数传递给其它函数。如果我们有像 add1 一样未柯里化的函数,那我们就必须用到它的全部两个参数来调用这个函数。然而,对于一个像 add2 一样被柯里化了的函数 来说,我们有两个选择:可以使用一个或两个参数来调用。

    相关文章

      网友评论

          本文标题:柯里化

          本文链接:https://www.haomeiwen.com/subject/vjkspxtx.html