Scala:继承多个辅助函数的通用性

时间:2017-04-24 14:16:46

标签: scala generics refactoring implicit generic-programming

我正在编写许多实用函数,它们的类型参数都具有相同的通用性。它们都有隐式参数,我也使用Aux pattern来关联其中的一些类型。以下是其中一些功能的签名:

def accumulateWeightedValue[A, B, AB]
            (accum: (A, AB), valueWithWeight: (A, B))
            (implicit combine: NumericCombine.Aux[A, B, AB]): (A, AB) ={...}

def weightedSum[A, B, AB]
            (valuesWithWeight: GenSeq[(A, B)])(implicit combine: NumericCombine.Aux[A, B, AB]):
            (A, AB) = {...}

def weightedAverageFloat[A, B, AB]
            (valuesWithWeight: GenSeq[(A, B)])(implicit combine: NumericCombine.Aux[A, B, AB])
            : Option[Float]

这些函数具有不同的显式参数类型不同的返回类型。但他们都分享相同依赖类型[A, B, AB]类型,并且具有相同的隐式参数

有没有办法以某种方式分解所有类型依赖信息,使函数看起来不那么繁琐,特别是随着这些函数的数量的增加?即改为:

def accumulateWeightedValue(accum: (A, AB), valueWithWeight: (A, B)): (A, AB)

def weightedSum(valuesWithWeight: GenSeq[(A, B)]):(A, AB)

def weightedAverageFloat(valuesWithWeight: GenSeq[(A, B)]): Option[Float]

明显的选择是让它们Utility参数化的所有类[A, B, AB]方法,但这意味着我的函数将不再可以作为独立函数foo()调用。

或许有可能与伴随对象做一些技巧,并在伴随对象中复制这些函数的完全模板化版本,并进行一些隐式重定向和一些重构,以使Utility.foo()调用方法{{1}在这个类的正确隐式实例上。然而,我不太确定这种方法的利弊。

有没有替代建议的方法?

仅供参考,这是此问题的context,您可以在此处查看demo上述功能的使用情况。

0 个答案:

没有答案