加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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类型,所以我们需要自己创建.我们的类型需要支持

>另外
>比较
> 0(添加的中性元素)

关于功能要求的新协议

比较在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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读