我想使用Scala的上下文绑定模式执行以下操作:
class Polynomial[T: Ring] {
def apply[X: Ring with Includes[T]](x: X): X = ...
...
}
这是一个多项式类,要求系数是Ring T
中的元素。将此多项式应用于元素(评估)时,参数x
的类型必须是一个环,类型T
的元素可以隐式转换为类型X
。例如T = Double, X = SquareMatrix
。
如何在Scala中对泛型类型参数施加多个类型约束?
答案 0 :(得分:2)
似乎[X: T]
语法不足以强加两个泛型类型约束。使用两个隐式参数解决了这个问题:
def apply[X](x: X)(implicit ring: Ring[X], conv: Includes[X, T]): X = {
var xi = ring.one
var sum = ring.zero
for (i <- 0 to degree) {
sum += xi * conv.from(coef(i))
xi *= x
}
return sum
}
答案 1 :(得分:-1)
[X: T]
语法只是语法糖,需要类型为T[X]
的隐式参数。例如,下面的f
和f2
相同:
def f[T: X]
def f2[T](implicit xt: X[T])
至于你的代码,如果你明确地写出了隐含参数,你将能够表达你的约束:
class Polynomial[T: Ring] {
def apply[X](x: X)(implicit xt: Ring[X] with Includes[T]): X = ...
}
请注意,您没有对X
或T
施加多个约束,您的约束对于上下文绑定的语法糖来说过于复杂。但是,Scala确实允许您根据需要对类型参数施加尽可能多的上下文边界,并且您也可以将它们与上限和下限组合:
def f[T >: List[Int] <: AnyRef : Ordering : List] = ???