gpt4 book ai didi

swift - Swift 中的 Curry 函数

转载 作者:IT王子 更新时间:2023-10-29 05:48:29 25 4
gpt4 key购买 nike

我想创建一个返回如下 curry 函数的函数

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

这种函数的返回类型是什么,我如何使用采用可变参数的函数生成这样的函数。

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,B,C,D>(f: (A, B, C) -> D) -> A -> B -> C -> D {
return { a in { b in { c in f(a,b,c) } } }
}

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

// etc.

关于swift - Swift 中的 Curry 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24107191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com