2

我想使用 Scala 的上下文绑定模式做以下事情:

    class Polynomial[T: Ring] {
        def apply[X: Ring with Includes[T]](x: X): X = ...
        ...
    }

这是一个多项式类,它要求系数是 a 中的元素Ring T。当将此多项式应用于元素(求值)时,参数的类型x必须是环,并且类型的元素T可以隐式转换为 type X。例如T = Double, X = SquareMatrix

如何在 Scala 中对泛型类型参数施加多个类型约束?

4

2 回答 2

3

似乎[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
   }
于 2014-07-13T12:30:06.990 回答
0

[X: T]语法只是需要 type 的隐式参数的语法糖T[X]。例如,ff2下面是相同的:

 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请注意,您没有对or施加多个约束T,您的约束对于上下文绑定的语法糖来说太复杂了。但是,Scala 确实允许您对类型参数施加尽可能多的上下文边界,并且您也可以将它们与上限和下限结合起来:

def f[T >: List[Int] <: AnyRef : Ordering : List] = ???
于 2014-07-13T03:14:36.343 回答