组合两个不同的函数定义——一个柯里化的,一个标准的
Combine two distinct function definitions - one curried, one standard
一直在研究 swift 中的柯里化函数,现在我正在尝试编写一个函数,它可以写成:
sum(1,2) //or
sum(1)(2) //both equal 3
这很容易通过两个函数定义来实现:
// curried - usage: sum(1)(2) or sum(1)
func sum(a: Int) -> (Int -> Int) {
return { b in a + b }
}
// regular - usage: sum(1,2)
func sum(a: Int, _ b: Int) -> Int {
return a + b
}
我一直在尝试将这些组合成一个函数,可以用任何一种方式调用,但我想我要么被难住了,要么没有解决方案。我尝试用泛型重新处理它,但仍然 运行 遇到参数数量的问题,即使有可选参数也是如此。
那么,关于如何结合这些的任何想法,或者 swift 是不可能的吗?
柯里化是一种将具有多个参数的函数转换为函数序列的方法。所以不,没有办法做到这一点。您唯一能做的就是创建 "interface"
func sum(a: Int) -> (Int -> Int) {
return { b in a + b }
}
func sum(a: Int, _ b: Int) -> Int {
return sum(a)(b)
}
我不知道你为什么要这样做,所以我可能完全错过了重点,但这是我能得到的最接近的...
enum IntOrFunction {
case Number(Int)
case Function((Int -> Int))
var function: (Int -> Int) {
switch self {
case .Function(let f):
return f
case .Number(let i):
return { _ in return i }
}
}
}
func sum(params: Int...) -> IntOrFunction {
if params.count == 1 {
let a = params[0]
return .Function({ b in a + b })
} else {
return .Number(params.reduce(0, combine: {[=10=] + }))
}
}
let a = sum(1,2) // "Number(3)"
let b = sum(1) // "Function((Function))"
let c = b.function(3) // "4"
也许你可以使用这样的东西:
func *<A, B, C>(lhs: A -> B -> C, rhs: (A, B)) -> C {
return lhs(rhs.0)(rhs.1)
}
func sum(a: Int)(_ b: Int) -> Int {
return a + b
}
sum(1)(2)
sum*(1, 2)
一直在研究 swift 中的柯里化函数,现在我正在尝试编写一个函数,它可以写成:
sum(1,2) //or
sum(1)(2) //both equal 3
这很容易通过两个函数定义来实现:
// curried - usage: sum(1)(2) or sum(1)
func sum(a: Int) -> (Int -> Int) {
return { b in a + b }
}
// regular - usage: sum(1,2)
func sum(a: Int, _ b: Int) -> Int {
return a + b
}
我一直在尝试将这些组合成一个函数,可以用任何一种方式调用,但我想我要么被难住了,要么没有解决方案。我尝试用泛型重新处理它,但仍然 运行 遇到参数数量的问题,即使有可选参数也是如此。
那么,关于如何结合这些的任何想法,或者 swift 是不可能的吗?
柯里化是一种将具有多个参数的函数转换为函数序列的方法。所以不,没有办法做到这一点。您唯一能做的就是创建 "interface"
func sum(a: Int) -> (Int -> Int) {
return { b in a + b }
}
func sum(a: Int, _ b: Int) -> Int {
return sum(a)(b)
}
我不知道你为什么要这样做,所以我可能完全错过了重点,但这是我能得到的最接近的...
enum IntOrFunction {
case Number(Int)
case Function((Int -> Int))
var function: (Int -> Int) {
switch self {
case .Function(let f):
return f
case .Number(let i):
return { _ in return i }
}
}
}
func sum(params: Int...) -> IntOrFunction {
if params.count == 1 {
let a = params[0]
return .Function({ b in a + b })
} else {
return .Number(params.reduce(0, combine: {[=10=] + }))
}
}
let a = sum(1,2) // "Number(3)"
let b = sum(1) // "Function((Function))"
let c = b.function(3) // "4"
也许你可以使用这样的东西:
func *<A, B, C>(lhs: A -> B -> C, rhs: (A, B)) -> C {
return lhs(rhs.0)(rhs.1)
}
func sum(a: Int)(_ b: Int) -> Int {
return a + b
}
sum(1)(2)
sum*(1, 2)