结合两个不同的函数定义 - 一个curried,一个标准

时间:2015-09-26 16:14:36

标签: ios swift currying

在swift中玩弄curried函数,我正在尝试编写一个函数,现在可以写成:

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都不可能?

3 个答案:

答案 0 :(得分:1)

Currying是一种将具有多个参数的函数转换为函数序列的方法。所以不,没有办法做到这一点。你唯一能做的就是创建“界面”

func sum(a: Int) -> (Int -> Int) {
    return { b in a + b }
}

func sum(a: Int, _ b: Int) -> Int {
    return sum(a)(b)
}

答案 1 :(得分:1)

我不知道你为什么要这样做,所以我可能完全错过了这一点,但这是我能接近它的最接近......

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"

答案 2 :(得分:0)

也许你可以使用这样的东西:

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)