【发布时间】:2015-03-17 01:41:48
【问题描述】:
下面的 sum 函数的两个变体是我尝试重复 Abelson 和 Sussman 在 Swift 中经典的“计算机程序的结构和解释”一书中介绍的 lisp 版本。第一个版本用于计算一个范围内的整数之和,或一个范围内的整数平方和,第二个版本用于计算 pi/8 的近似值。
我无法将版本组合成一个可以处理所有类型的函数。有没有巧妙的方法来使用泛型或其他 Swift 语言特性来组合变体?
func sum(term: (Int) -> Int, a: Int, next: (Int) -> Int, b: Int) -> Int {
if a > b {
return 0
}
return (term(a) + sum(term, next(a), next, b))
}
func sum(term: (Int) -> Float, a: Int, next: (Int) -> Int, b: Int) -> Float {
if a > b {
return 0
}
return (term(a) + sum(term, next(a), next, b))
}
与
sum({$0}, 1, {$0 + 1}, 3)
结果为 6
sum({$0 * $0}, 3, {$0 + 1}, 4)
结果为 25
8.0 * sum({1.0 / Float(($0 * ($0 + 2)))}, 1, {$0 + 4}, 2500)
结果为 3.14079
【问题讨论】:
-
结构/枚举怎么样?
标签: swift functional-programming generics