首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala2.10中,如何将两个泛型列表中的每个元素添加到一起

在Scala2.10中,如何将两个泛型列表中的每个元素添加到一起
EN

Stack Overflow用户
提问于 2012-11-30 02:50:07
回答 1查看 444关注 0票数 3

我正在尝试将一些java数学类重写为Scala,但遇到了一个奇怪的问题。

代码语言:javascript
复制
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

map函数中的第二个下划线突出显示了错误,但我认为这不是问题所在。

我想做的是:

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)

对于第二个函数,我可能必须在较短的列表中填充零个元素才能使其工作,但这就是我在此函数上的目标。

那么,如何编译这个函数,以便对其进行测试呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-30 03:11:52

List不是专门化的,所以专门化这个类没有多大意义。只有Array是专门化的。

代码语言:javascript
复制
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)
      }
    }
  }
}

现在我们可以

代码语言:javascript
复制
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,这样您就不会因为隐式加法函数而受到污染。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13632637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档