swift - 如何在 Swift 中编写翻转方法?

标签 swift

我想用 Swift 写一个翻转方法。

这是签名。 序曲> :t flip 翻转::(a -> b -> c) -> b -> a -> c

我在 Swift 中的代码:

func flip1<A, B, C>(f: A->B->C) -> (B->A->C) {

    return { (valueB: B, valueA: A) in
        return f(valueA, valueB)
    }
}

func flip2<A, B, C>(f: A->B->C) -> (B->A->C) {

    return { (valueB: B) in
        return { (valueA: A) in
            return f(valueA)(valueB)
        }
    }
}

flip1 方法无法编译。 return f(valueA, valueB) 行出现错误 Extra argument in call

flip2 方法工作正常,除了 flipped 方法只能像这样调用 method(1)(2)

如何编写 flip 方法以便我可以使用像 method(1, 2)method(1)(2)

最佳答案

A->B->C 是一种接受一个 A 类型参数的函数类型 并返回一个函数 B->C(一个“curried”函数)。函数类型 两个参数是 (A, B)->C:

func flip<A, B, C>(f: (A, B)->C) -> (B, A)->C {

    return { (valueB: B, valueA: A) in
        return f(valueA, valueB)
    }
}

let x = flip(-)(10, 5)
println(x) // -5

可以稍微缩短为

func flip<A, B, C>(f: (A, B)->C) -> (B, A)->C {

    return { (valueB, valueA) in
        f(valueA, valueB)
    }
}

由于自动类型推断。

据我所知,Swift不会自动转换函数 将多个参数带入柯里化(Currying)函数,比较 Typecase regular Swift function to Curry Function .

关于swift - 如何在 Swift 中编写翻转方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593940/

相关文章:

ios - CIPerspectiveCorrection 过滤器返回翻转和反转的图像

ios - Swift - 到达个人文档

ios - 单击 TextView 上打开 UIPickerView 而不是键盘

ios - NSFetchedResultsController 不使用谓词@count 调用委托(delegate)

arrays - 获取枚举数组的基数组

swift - 不需要闭包返回值时如何调用函数

ios - 如何使用 FCM 在 ios 推送通知中播放自定义通知声音

swift - 日期组件出错

ios - UILabel 高度取决于文本

ios - 从我的 CoreData 获取数据并使用 Swift 将其呈现在 TableView 中时出现 fatal error