簡體   English   中英

對 Scala 類型參數施加多個泛型類型約束

[英]Impose more than one generic type constraint on a Scala type parameter

我想使用 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 中的泛型類型參數強加一種以上的類型約束?

似乎[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
   }

[X: T]語法只是語法糖,用於要求類型為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 = ...
}

請注意,您不會對XT施加多個約束,您的約束對於上下文綁定的語法糖來說太復雜了。 但是,Scala 確實允許您根據需要在類型參數上施加盡可能多的上下文邊界,並且您也可以將它們與上限和下限結合起來:

def f[T >: List[Int] <: AnyRef : Ordering : List] = ???

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM