swift 柯里化

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

参照:objc.io|objc 中国

/**

1.add0 和 add的例子向我们展示了如何将一个接受多参数的函数变换为一系列只接受单个参数的函数,这个过程被称为柯里化
(Currying),它得名于逻辑学家 Haskell Curry;我们将 add
称为 add0 的柯里化版本

2.首先向函数传递第一个参数 1,然后将返回的函数应用到第二个参数
2

3.我们甚至可以省略 addTheSome函数的一个 return
关键字和返回类型中的某些括号

addTheSome后写为下面这样:函数中的箭头 ->向右结合。这也就是说,你可以将
A -> B -> C理解为 A -> (B -> C)

*/

func add0(x: Int,_ y:
Int) ->Int {

return x + y }

func add(x:Int)-> (Int ->Int){

return{y inreturn x + y}

}

func addTheSome(x:Int)->Int ->
Int{

return { y in x + y }

}

add(1)(3)

addTheSome(1)(3)

柯里化
应用封装Core Image

//封装Core Image

// Filter 类型定义为一个函数,该函数接受一个图像作为参数并返回一个新的图像

typealias Filter =
CIImage -> CIImage

/**

blur 函数返回一个新函数,新函数接受一个 CIImage类型的参数 image,
并返回一个新图像(return  lter .outputImage)。

因此,blur
函数的返回值满足我们之前定义
的 CIImage -> CIImage,也就是 Filter类型

*/

func blur(radius:
Double) -> Filter {

return {image
in

let parameters = [
kCIInputRadiusKey: radius, kCIInputImageKey: image]

guard let  lter =CIFilter(name:
"CIGaussianBlur", withInputParameters:parameters)else {fatalError()}

guard let outputImage =  lter.outputImageelse {fatalError()}

return outputImage

}

}

/**

定义一个生成固定颜色的滤镜

颜色生成 滤镜不检查输入图像。因此,我们不需要给返回函数中的图像参数命名。取而代之,我们使用

一个匿名参数 _ 来强调滤镜的输入图像参数是被忽略的

*/

func colorGenerator(color:
NSColor) -> Filter {

return {
_ in

guard let c = CIColor(color: color)else { fatalError () }

let parameters = [kCIInputColorKey: c]

guard let  lter = CIFilter (name:"CIConstantColorGenerator",

withInputParameters: parameters) else { fatalError() }

guard let outputImage =  lter.outputImageelse { fatalError() }

return outputImage

}

}

/**

定义合成滤镜

将输出图像剪裁为与输入图像一致的尺寸严格来说,这不是必须的,而完全取决

于我们希望滤镜如何工作

*/

func compositeSourceOver(overlay:
CIImage) -> Filter {

return { image
in

let parameters = [
kCIInputBackgroundImageKey: image, kCIInputImageKey: overlay

]

guard let  lter =CIFilter (name:
"CISourceOverCompositing",

withInputParameters: parameters) else {fatalError() }

guard let outputImage =  lter.outputImageelse {
fatalError() }

let cropRect = image.extent

return outputImage.imageByCroppingToRect(cropRect)

}

}

/**

结合两个滤镜来创建颜色叠层滤镜

返回了一个接受图像作为参数的函数。colorOverlay函数首先调用了 colorGenerator滤镜。

colorGenerator 滤镜需要一个 color作为参数,然后返回一个新的滤镜,因此代码片段

colorGenerator(color)
是 Filter 类型。而 Filter类型本身就是一个从 CIImage到 CIImage

函数;

因此我们可以向 colorGenerator(color)函数传递一个附加的 CIImage类型的参数,最终我们能够得到一个
CIImage类型的新叠层。这就是我们在定义 overlay的过程中所发生的全部
事情事,可以大致概括为 ——首先使用 colorGenerator函数创建一个滤镜,接着向这个滤镜传递一个
image 参数来创建新图像。与之类似,返回值 compositeSourceOver(overlay)(image)由一个通过
compositeSourceOver(overlay)函数构建
的滤镜和随即被作为参数的 image
组成

*/

func colorOverlay(color:NSColor)->Filter{

return { image
in

let overlay =
colorGenerator(color)(image)

return compositeSourceOver(overlay)(image)

}

}

// 到现在为止,我们已经定义了模糊滤镜和颜色叠层滤镜,可以把它们组合在一起使用:首先将

// 图像模糊,然后再覆盖上一层红色叠层

let url = NSURL(string:"http://www.objc.io/images/covers/16.jpg")!

let image = CIImage(contentsOfURL:url)!

// 链式地将两个滤镜应用到载入的图像上

let blurRadius = 5.0

let overlayColor = NSColor.redColor().colorWithAlphaComponent(0.2)

let blurredImage =
blur(blurRadius)(image)

let overlaidImage =colorOverlay(overlayColor)(blurredImage)

// 复合函数

//将上面代码里两个调用滤镜的表达式简单合为一体:可读性差

let result =
colorOverlay(overlayColor)(blur(blurRadius)(image))

// 定义一个用于组合滤镜的函数

/**

composeFilters 函数接受两个 Filter类型的参数,并返回一个新定义的滤镜。

这个复合滤镜接 受一个 CIImage类型的图像参数,然后将该参数传递给

lter1,取得返回值之后再传递给lter2.可以使用复合函数来定义复合滤镜

*/

func composeFilters( lter1:
Filter , _  lter2 :
Filter ) -> Filter {

return { image
in  lter2 (  lter1 (image)) } }

let myFilter1 =
composeFilters(blur(blurRadius),colorOverlay(overlayColor))

let result1 =
myFilter1(image)

/// 为了让代码更具可读性,我们可以再进一步,为组合滤镜引入运算符。诚然,随意自定义运算

//符并不一定对提升代码可读性有帮助。不过,在图像处理库中,滤镜的组合是一个反复被讨论

//的问题,所以引入运算符极有意义

infix operator >>> {associativity left }

func >>> (  lter1 :
Filter ,  lter2 : Filter ) ->
Filter {

return { image
in  lter2 (  lter1 (image)) }

}

//与之前使用 composeFilters的方法相同,现在我们可以使用 >>>运算符达到目的:

//由于已经定义的运算符 >>>是左结合的 (left-associative),就像 Unix的管道一样,

//滤镜将以从左到右的顺序被应用到图像上

let myFilter2 =
blur(blurRadius)>>>
colorOverlay(overlayColor)

let result2 =
myFilter2(image)

时间: 2024-10-14 10:59:03

swift 柯里化的相关文章

Swift # 柯里化函数

前言 此次文章,讲述的是Swift的一个新特性(柯里化函数),可能很多iOS开发人员是第一次听这个词汇,包括我自己也是,自己也用了几天时间才总结出来,希望能帮助到各位咯,个人感觉偏向有开发经验的码友,如果零基础的看懂,希望能给个赞,??! 如果喜欢我的文章,可以关注我,随着后续不断学习Swift中,陆续还会有更新ing.... 什么是柯里化函数? 柯里化(Currying),又称部分求值(Partial Evaluation),是一种函数式编程思想,就是把接受多个参数的函数转换成接收一个单一参数

Swift开发第四篇——柯里化

本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法. func addTwoNumbers(a: Int)(num: Int) -> Int { return a + num } 然后通过只传入第一个括号内的参数进行调用,这样将返回另一个方法 let addToFour = addTwoNumbers(4) let result = add

[Swift]Day07:柯里化

Swift 中的柯里化 新手上路的学习笔记,如有错误还望指出,不胜感激. 上集:理论预备 在学习柯里化的过程中接触到了三个有趣的概念,在此和各位分享一下. 偏函数 (Partial Function) 偏函数是只对函数定义域的一个子集进行定义的函数,是一个数学概念. 偏函数定义如下: 从输入值集合 X 到可能的输出值集合 Y 的函数 f (记作f:X→Y) 是 X 和 Y 的关系,若 f 满足多个输入可以映射到一个输出,但一个输入不能映射到多个输出,则为偏函数. 换句话说,定义域 X 中可能存在

swift 学习笔记之在柯里化(Currying)

有时候我们看到的方法中有很多组的参数,可能会让大家觉得疑惑,其实是因为这个方法使用了柯里化.Swift里可以对方法进行柯里化,也就说有多个参数的方法可以接受第一个参数,然后变成一个接受余下参数并且返回结果的新方法,举个例子: func twoTemp(a:Int)(b:Int) -> Int{ return a + b } 这个方法有两组参数,可以只传第一个参数: let oneTemp = twoTemp(1) 这里的oneTemp是一个新的方法,类型如图所示 这个新方法接受剩下的b作为参数,

Swift函数柯里化(Currying)简谈

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化简单的说就是把接收多个参数的函数划分为若干个"嵌套"的单一参数的函数. 这样说谁也听不懂,我们结合一个例子给大家简单说说. 我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;) 首先是蜘蛛的类: class Spider:C

javascript中利用柯里化函数实现bind方法

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

JS中的柯里化(currying)

何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个简单的例子 var concat3Words = function (a

浅谈JavaScript中的柯里化函数

首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的. 用于创建已经设置好了一个或多个参数的函数 与函数绑定相似,他们之间的区

建议75:函数柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数.下面可以通过例子来帮助理解.function adder(num) {    return function(x) {        return num + x;    }}var add5 = adder(5);var add6 = adder(6);print(add5(1));  // 6print(add6(1));  //7 函数adder接受一个参数,并返回一个函数,这个返