加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift中的咖喱功能

发布时间:2020-12-14 02:27:22 所属栏目:百科 来源:网络整理
导读:我想创建一个返回咖喱函数的函数,如下所示 func addTwoNumbers(a: Int)(b: Int) - Int { return a + b}addTwoNumbers(4)(b: 6) // Result: 10var add4 = addTwoNumbers(4)add4(b: 10) // returns 14 这种函数的返回类型是什么?如何使用采用Variadic参数的函
我想创建一个返回咖喱函数的函数,如下所示
func addTwoNumbers(a: Int)(b: Int) -> Int {
    return a + b
}

addTwoNumbers(4)(b: 6) // Result: 10

var add4 = addTwoNumbers(4)
add4(b: 10) // returns 14

这种函数的返回类型是什么?如何使用采用Variadic参数的函数生成这样的函数.

func generateCurry(.../*Variadic parameters*/) -> .../*curry function type*/ {
  return ...//curry function
}

我想要一个通用的解决方案,而不是只将Int作为参数在generateCurry函数的参数中

let curried = curry(func(a,b,c) {
  print(a + b + c)
})
curried(1)(2)(3) //prints 6
你可以通过闭包轻松实现这一目标:
/// Takes a binary function and returns a curried version
func curry<A,B,C>(f: (A,B) -> C) -> A -> B -> C {
    return { a in { b in f(a,b) } }
}

curry(+)(5)(6) // => 11

let add: Int -> Int -> Int = curry(+)
add(5)(6) // => 11

如果能够为需要3,4个或更多参数的函数执行相同的操作,但不重复实现,那将是非常好的.这样一个函数的签名可能会开始:

/// Take a function accepting N arguments and return a curried version
func curry<T>(args: T...) -> /* ? */

返回类型是什么?它会根据函数的输入而改变.这在目前Swift中是不可能的,如果没有某种宏系统,我认为它根本不可能.但即使使用宏,我也不认为编译器会满意,除非它在编译时知道列表的长度.

话虽如此,使用接受3,4,5或更多参数的版本手动重载currying函数是非常简单的:

func curry<A,C,D>(f: (A,C) -> D) -> A -> B -> C -> D {
    return { a in { b in { c in f(a,c) } } }
}

func curry<A,D,E>(f: (A,D) -> E) -> A -> B -> C -> D -> E {
    return { a in { b in { c in { d in f(a,c,d) } } } }
}

// etc.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读