首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的逆流函数

Swift中的逆流函数
EN

Stack Overflow用户
提问于 2019-01-30 01:14:18
回答 2查看 214关注 0票数 1

我有一个函数,它接受两个参数并返回一个值。

例如

代码语言:javascript
复制
func sum(x: Int, y: Int) -> Int {
    return x + y
}

下一步是使用一个currying来获取一个函数,该函数接受唯一的第一个参数并返回一个带有适当签名的闭包。此外,我还编写了一个类型别名,以使结果类型更加清晰。

代码语言:javascript
复制
typealias EscapingClosure<A, B> = (A) -> B
func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> EscapingClosure<A, (B) -> C> {
    return { (a: A) -> ((_ b: B) -> C) in
        return { (b: B) -> C in f(a, b) }
    }
}

但是,我想起了uncurry函数,如果我要将它应用于所述结果,它应该返回一个默认的sum函数签名。因此,我尝试实现了uncurry的一个变体,并得到了如下结果:

代码语言:javascript
复制
func uncarry<A, B, C>(_ f: @escaping EscapingClosure<A, (B) -> C>) -> (A, B) -> C {
    return { (a: A, b: B) -> C in
        return f(a)(b)
    }
}

但是,这里有一个问题--我不能用这个uncurry函数来处理sum函数的结果,因为uncurry只需要@转义参数,在该参数中,合并的函数返回一个非转义变量。

这里有一个Swift编译器错误:

代码语言:javascript
复制
Cannot convert value of type '((A) -> Void) -> ()' to expected argument type '(_) -> (_) -> _'

有没有人知道在Swift中创建uncurry函数的任何方法,这些方法适用于所述函数的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-30 02:25:35

您的uncurry函数可以做到这一点,取消咖喱咖喱函数:

代码语言:javascript
复制
let currableSum = curry(sum)
let uncurriedSum = uncurry(currableSum)

let add100 = currableSum(100)
print(add100(23)) // => 123

print(uncurriedSum(2, 2)) // => 4

问题是你把不参加比赛误认为不适用。一旦您部分地或完全地应用了一个临时函数(或任何函数),就没有任何机制可以返回,从而获得产生结果的原始函数。

代码语言:javascript
复制
uncurry(add100) // ❌ can't "unapply" a partially applied function

想象一下,如果是这样的话。每个整数、字符串和其他值都必须记住导致它的函数的历史。我想不出有一个用例。首先,它需要动态输入(或者使用像Swift这样的静态语言强制编译时转换),因为您无法预测产生给定结果的任意函数的签名。

票数 2
EN

Stack Overflow用户

发布于 2019-01-30 01:49:45

正如@Alexander上文所写的,我可以很容易地使用uncurry函数来处理sum()的仓促结果。

当传递curried函数的结果值时,我犯了一个错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54431989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档