一直在快速处理咖喱函数,现在我正在尝试编写一个可以写成以下形式的函数:
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
}
我一直试图将它们组合成一个可以用任何一种方式调用的函数,但是我认为我要么陷入困境,要么没有解决方案。我尝试使用泛型类型对其进行重新处理,但仍然遇到参数数量的问题,即使使用可选参数也是如此。
那么,关于如何将它们结合起来的任何想法,还是不可能迅速实现?
我不知道您为什么要尝试执行此操作,因此我可能完全错过了要点,但这是我能找到的最接近的内容...
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: {$0 + $1}))
}
}
let a = sum(1,2) // "Number(3)"
let b = sum(1) // "Function((Function))"
let c = b.function(3) // "4"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句