我正在尝试将一些java数学类重写为Scala,但我遇到了一个奇怪的问题。
class Polynomials[@specialized T](val coefficients:List[T]) {
def +(operand:Polynomials[T]):Polynomials[T] = {
return new Polynomials[T](coefficients =
(operand.coefficients, this.coefficients).zipped.map(_ + _))
}
}
我的问题可能与此问题相似:How do I make a class generic for all Numeric Types?,但当我删除@specialized
时,我会收到同样的错误。
type mismatch; found : T required: String
地图功能中的第二个下划线突出显示错误,但我不认为这是问题。
我想做的是:
Polynomial(1, 2, 3) + Polynomial(2, 3, 4)
返回Polynomial(3, 5, 7)
Polynomial(1, 2, 3, 5) + Polynomial(2, 3, 4)
返回Polynomial(3, 5, 7, 5)
对于第二个,我可能需要用零元素填充较短的列表以使其工作,但这是我在此功能上的目标。
那么,我怎样才能编译这个函数,所以我可以测试一下呢?
答案 0 :(得分:9)
List
不是专业的,所以没有太多的意义使这个课程专业化。只有Array
是专门的。
class Poly[T](val coef: List[T]) {
def +(op: Poly[T])(implicit adder: (T,T) => T) =
new Poly(Poly.combine(coef, op.coef, adder))
}
object Poly {
def combine[A](a: List[A], b: List[A], f: (A,A) => A, part: List[A] = Nil): List[A] = {
a match {
case Nil => if (b.isEmpty) part.reverse else combine(b,a,f,part)
case x :: xs => b match {
case Nil => part.reverse ::: a
case y :: ys => combine(xs, ys, f, f(x,y) :: part)
}
}
}
}
现在我们可以
implicit val stringAdd = (s: String, t: String) => (s+t)
scala> val p = new Poly(List("red","blue"))
p: Poly[String] = Poly@555214b9
scala> val q = new Poly(List("fish","cat","dog"))
q: Poly[String] = Poly@20f5498f
scala> val r = p+q; r.coef
r: Poly[String] = Poly@180f471e
res0: List[String] = List(redfish, bluecat, dog)
您也可以要求类提供加法器而不是+方法,或者您可以继承Function2,这样就不会使用隐式加法函数来污染事物。