创建无限添加功能

时间:2015-07-12 14:48:49

标签: swift functional-programming

我只是想知道你们是否可以想到在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 }
}

我想最后的()需要指出'停止返回一个函数但返回结果'。

3 个答案:

答案 0 :(得分:2)

不幸的是,在Swift中你无法计算任意数量的参数。 (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

要总结无限列表,您需要像扫描这样的函数:

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]

答案 1 :(得分:1)

我能想到的最接近的是一个可变的解决方案,如果你想要它比vadian之前的答案更有用,也许使用reduce而不是循环...

func sumOf(numbers: Int ...) -> Int {
    return numbers.reduce(0, combine: +)
}


sumOf(1, 2, 3, 4, 5) // returns 15

答案 2 :(得分:0)

你的意思是带有varidic参数的函数吗?

从Swift语言指南中稍加改动

func sumOf(numbers: Int...) -> Int {
  var total: Int = 0
  for number in numbers {
    total += number
  }
  return total
}

sumOf(1, 2, 3, 4, 5) // 15
sumOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) // 55