2015-07-12 90 views
1

我只是想知道如果你们能想到在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 } 
} 

我想最终()需要指出somekind的的“停止回功能,但返回的结果,而不是”。

+0

什么语言? Lambda微积分思考 –

+0

如果可能,我正在寻找Swift中的实现。 –

+0

如果你试图写下你想定义的函数的类型,你会发现它很困难。 – molbdnilo

回答

0

你是指具有varidic参数的函数吗?

从斯威夫特语言指南,稍微改变

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 
+0

我知道这是可能的,结果是正确的,但我正在寻找一个更“功能”的方式:) –

2

在斯威夫特不能咖喱的任意数目参数的,很遗憾。 (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] 

但是,由于该表你工作是无限的,如果你想使用它没有分歧,你需要一个功能,如采取:

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] 
+2

我只是想评论,也有一个伟大的图书馆,正是这样做,但后来我看到你的用户名,并记得你是谁写的人:D – Kametrixom

1

我能想到的将是一个可变参数的解决方案,如果你想比vadian以前的答案更多的功能,或者是用降低,而不是循环最近..

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


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