gpt4 book ai didi

swift - 创建无限相加函数

转载 作者:搜寻专家 更新时间:2023-11-01 06:45:26 26 4
gpt4 key购买 nike

我只是想知道你们是否能想到在 Swift 中实现这样一个无限的 add 函数。

let result = add(1)(2)(3)(4)(5)() // 15

我有两个参数调用 let res = add(1)(2) 的基本解决方案,但似乎可以找到处理无限数字的方法。

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

我想最后的 () 需要指示某种“停止返回函数但返回结果”。

最佳答案

不幸的是,在 Swift 中你不能柯里化(Currying)任意数量的参数。 ( Some functional libraries go to great lengths to give you behaviour that's kind of like it - but it's limited at a certain number )

不过,要对无限列表求和,您需要一个类似 scan 的函数:

extension SequenceType {
func scan<T>(var initial: T, combine: (T, Generator.Element) -> T) -> LazySequence<MapSequence<Self, T>> {
return lazy(self).map {
element -> T in
initial = combine(initial, element)
return initial
}
}
}

效果如下:

[1, 2, 3, 4, 5].scan(0, combine: +) // [1, 3, 6, 10, 15]

但是,由于您正在使用的列表是无限的,如果您想在不发散的情况下使用它,您将需要一个像 take 这样的函数:

extension SequenceType {
func take(var n: Int) -> [Generator.Element] {
var g = self.generate()
var ret: [Generator.Element] = []
while --n >= 0, let next = g.next() { ret.append(next) }
return ret
}
}

所以你可以这样使用它:

(1..<100).scan(0, combine: +).take(10) // [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

关于swift - 创建无限相加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31369056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com