Swift中的泛型和函数式编程
发布时间:2020-12-14 04:48:57 所属栏目:百科 来源:网络整理
导读:以下sum函数的两个变体是我试图重复Abelson和Sussman在 Swift中经典的“计算机程序的结构和解释”一书中介绍的lisp版本.第一个版本用于计算范围内的整数之和,或一个范围内整数的平方和,第二个版本用于计算pi / 8的近似值. 我无法将这些版本组合成一个能够处
以下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,b: Int) -> Float { if a > b { return 0 } return (term(a) + sum(term,b)) } 同 sum({$0},1,{$0 + 1},3) 结果是6 sum({$0 * $0},3,4) 结果是25 8.0 * sum({1.0 / Float(($0 * ($0 + 2)))},{$0 + 4},2500) 结果是3.14079 解决方法
为了使它更容易,我稍微改变了方法签名,并假设它足以用于func sum_< T> (术语:(T→T),a:T,下一个:(T→T),b:T) – > T {,其中T是某种数字.
不幸的是,Swift中没有Number类型,所以我们需要自己创建.我们的类型需要支持 >另外 关于功能要求的新协议 比较在Comparable协议中处理,为了重置我们可以创建自己的协议: protocol NeutralAdditionElementProvider { class func neutralAdditionElement () -> Self } protocol Addable { func + (lhs: Self,rhs: Self) -> Self } 总结实施 我们现在可以实现sum函数: func sum <T where T:Addable,T:NeutralAdditionElementProvider,T:Comparable> (term: (T -> T),a: T,next: (T -> T),b: T) -> T { if a > b { return T.neutralAdditionElement() } return term(a) + sum(term,b) } 使Int和Double符合协议 ??已经为Double和Int实现,因此协议一致性很容易: extension Double: Addable {} extension Int: Addable {} 提供中性元素: extension Int: NeutralAdditionElementProvider { static func neutralAdditionElement() -> Int { return 0 } } extension Double: NeutralAdditionElementProvider { static func neutralAdditionElement() -> Double { return 0.0 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |