ios - 组合两种不同的函数定义 - 一种柯里化(Currying),一种标准

标签 ios swift currying

一直在 swift 中使用柯里化(Currying)函数,现在我正在尝试编写一个可以写为的函数:

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 是不可能的吗?

最佳答案

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

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"

关于ios - 组合两种不同的函数定义 - 一种柯里化(Currying),一种标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32799189/

相关文章:

ios - WebRTC 音频无法使用 CallKit 在锁定屏幕中工作

ios - 更新后不调用 SKPaymentQueue updatedTransactions 方法

iphone - 我可以使用 Instruments "profile"使用测试用例来解决内存泄漏问题吗? (即集中运行在定义的代码区域)

ios - MPMoviePlayerController 未停留在 UIView 的范围内

ios - Swift sender.setTitle 代码不可见?

javascript - 在 curry 函数中调用 null 的目的(JavaScript 实现)

c++ - 如何将右值引用参数传递给 C++ 中的模板 operator() 函数?

Java 8 部分函数应用/柯里化(Currying)

ios - 为什么 UIWebView 不在 applicationWillTerminate : in my app delegate? 加载 NSURLRequest

iphone - 如何使用 GameKit 报告旧分数?