澳门至尊网站-首页

您的位置:澳门至尊网站 > 搜索引擎 > 甩掉的柯里化

甩掉的柯里化

2019-11-08 12:09

// 柯里化 

柯里化在维基百科的讲解是把选用八个参数函数调换来接收八个单纯参数(最先函数的首先个参数卡塔 尔(阿拉伯语:قطر‎的函数,何况重返接纳余下的参数何况回去结果的新函数的技艺。

//                               斯威夫特 2.0 柯里化方法 (抛弃)

上面来比喻来看看柯里化和平日方法有啥差异:

//                       Swift 3.0 柯里化常用方法推荐

拿多少个数相乘来看

澳门至尊网站,//   函数式编制程序

貌似方法

那般定义:

func multiple (a first: Int,b second:Int) -> Int { return first * second}

用法:

let result = multiple(a : 10, b : 10)

但即使本人期待三次只输入三个值又该怎么办吧?这里就须求动用柯里化了。

/*

柯里化

定义:

func multiple(a first: Int)(b second:Int) -> Int{ return first * second}

用法:

let putFirst = multiplelet result = putFirst

上面大家打字与印刷一下结实看看这调用的几个方式再次来到的究竟是什么样:

澳门至尊网站 1EF212A48-8952-441B-847A-8FE8BBA0221D.png

由上海体育场合能够见见 let putFirst = multiple再次回到的照旧是三个Int ->Int类型,熟知函数的能够见到那是传进一个Int类型值再次回到一个Int类型值的函数,所以说柯里化其实就是经受二个函数类型的重临值。于是其实方法仍然为能够写成那样的风华正茂种样式:

func multiple(a first:Int) -> (Int -> Int) { return { second in return first * second }}

从此今后处就能够清晰的看见再次来到值是 一个(Int -> Int)类型函数。调用方法和下边那种办法雷同,另意气风发种调用方法能够那样写:

let abc = multiple

 Curried function declaration syntax func foo(x: Int)(y: Int) is of limited usefulness and creates a lot of language and implementation complexity. We should remove it.

将函数柯里化

该格局如下:

func currying (method : ->Int) -> (Int -> (Int -> Int)){ return { first in { second in return method(first,second) } }}

小编们从打字与印刷的结果来剖判

澳门至尊网站 2B5B0CF60-4006-4F4F-8819-F79A8335628E.png

第生机勃勃第一步是将原函数字传送进来,那个时候反回的是三个Int->(Int->Int)类型的函数,紧接着第二步大家传入一个Int值再次来到的就是三个(Int->Int)类型的函数。于是大家再盛传第一个Int值,当时就能反回最终的结果。

 

Implementing Target-Action in Swift

在喵神的博客里看见柯里化的三个用场,正是就要在Swift中落到实处Target-Action,OleBegemann 在博客中写的很明白,作者就间接贴出代码。定义:

protocol TargetAction { func performAction()}struct TargetActionWrapper<T: AnyObject> : TargetAction { weak var target: T? let action:  -> () -> () func performAction() -> () { if let t = target { action } }} enum ControlEvent { case TouchUpInside case ValueChanged // ...} class Control { var actions = [ControlEvent: TargetAction]() func setTarget<T: AnyObject>(target: T, action:  -> () -> (), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper(target: target, action: action) } func removeTargetForControlEvent(controlEvent: ControlEvent) { actions[controlEvent] = nil } func performActionForControlEvent(controlEvent: ControlEvent) { actions[controlEvent]?.performAction() }}

用法:

class MyViewController { let button = Control() func viewDidLoad() { button.setTarget(self, action: MyViewController.onButtonTap, controlEvent: .TouchUpInside) } func onButtonTap() { println("Button was tapped") }}

这么就落到实处了Target-Action方式。那正是本人对柯里化的部分主干领会。刚初步学Swift,倘若有错误之处多谢提出,迎接多多调换。

 (函数的 currying 天性的行使意况并非常的小,但他会大增非常多言语的错综相连,所以必要删除它)

 */

 

 1 class Currying
 2 
 3 {
 4 
 5     // uncurried:普通函数
 6 
 7     // 接收多个参数的函数(与类相关的函数,统称为方法,但是这里就直接说函数了,方便理解)
 8 
 9     func add(a: Int, b: Int, c: Int) -> Int{
10 
11         print("(a) + (b) + (c)")
12 
13         return a + b + c
14 
15     }
16 
17     
18 
19     // curried:柯里化函数 --> 本质函数式编程思想
20 
21     func addCur(_ a: Int) -> (Int) -> (Int) -> Int{
22 
23         return {
24 
25             b in
26 
27             return {
28 
29                 c in
30 
31                     a + b + c
32 
33             }
34 
35         
36 
37         }
38 
39     }
40 
41 }
42 
43  
44 
45 let curry = Currying()
46 
47 var number = Currying.addCur(curry)(12)(23)(12)
48 
49 print(number)
50 
51  
52 
53 // NO.2
54 
55 let datePrint:(Int)->(Int)->(String)->Void =
56 
57 {
58 
59     month in
60 
61     print("(month)月")
62 
63     return{
64 
65         day in
66 
67         print("(day)日")
68 
69         return{
70 
71             action in
72 
73             print("(action)")
74 
75         }
76 
77     }
78 
79 }
80 
81 let actionPrint = datePrint(2016)(11)
82 
83 actionPrint("写详细")
84 
85  

 

本文由澳门至尊网站发布于搜索引擎,转载请注明出处:甩掉的柯里化

关键词: