一些运算符

2017-08-21  本文已影响11人  胖红Red
>>>

已经定义的运算符 >>> 是左结合的 (left-associative),就像 Unix 的管道一样,滤镜将以从 左到右的顺序被应用到图像上。
我们定义的组合滤镜运算符是一个复合函数的例子。在数学中,f 和 g 两个函数构成的复合函 数有时候被写作 f · g,表示定义的新函数将输入的 x 映射到 f(g(x))。除了顺序,这恰恰也是 我们的 >>> 运算符所做的:将一个图像参数传递给运算符操作的两个滤镜。

->

函数中的箭头 -> 向右结合。这也就是说,你可以将 A -> B -> C 理解为 A -> (B -> C)。然而在 本书中,我们通常会为函数类型引入一个类型别名 (像我们对 Region 和 Filter 类型做的处理一 样),或者是显式地写括号来提升代码的可读性。

科里化

如何将一个接受多参数的函数变换为一系列只接受单个参数 的函数,这个过程被称为柯里化 (Currying)

 func add1(x: Int, _ y: Int) -> Int {
                   return x + y 
 }
add1 函数接受两个整型参数并返回它们的和;然而在 Swift 中,我们对该函数的定义还可以有 另一个版本:
 func add2(x:Int) -> (Int -> Int) { return{ y in returnx +y }
}

这里的 add2 函数接受第一个参数 x 之后,返回一个闭包,然后等待第二个参数 y。这两个 add
函数的调用方法自然也是不同的:

add1(1, 2)

add2(1)(2)

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

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

func add2(x: Int) -> Int -> Int { return { y in x + y }
}
上一篇下一篇

猜你喜欢

热点阅读