簡體   English   中英

scala中的上下文邊界和模式匹配

[英]Context bounds and pattern matching in scala

我正在使用scala中的上下文邊界進行實驗,但我找不到一種方法來使這兩個函數中的任何一個成為typecheck:

abstract class Expr
case class Val[T: Numeric](v: T) extends Expr
case object Other extends Expr

val e1 = Val(1)
val e2 = Val(2)

def addExp1(e1: Expr, e2: Expr): Expr = (e1, e2) match {
  case (Val(v1), Val(v2)) => Val(v1+v2)
  case _ => Other
}

def addExp2[T: Numeric](e1: Expr, e2: Expr): Expr = (e1, e2) match {
  case (Val(v1: T), Val(v2: T)) => Val(v1+v2)
  case _ => Other
}

在addExp1的情況下,我可以理解編譯器在函數定義點沒有信息知道Val的參數是Numeric,因此有一個+方法。 它只匹配Any作為v1的類型。

在addExp2的情況下,如何強制模式中的綁定? 類型被“擦除”......刪除時刪除了T注釋...

我夢想擁有的是一個單一的點來放置界限,理想情況下是Val類的定義。

避免丟失參數化類型Val的一種方法是讓Expr也采用類型參數。

abstract class Expr[T]
case class Val[T: Numeric](v: T) extends Expr[T]
case object Other extends Expr[Nothing]

val e1 = Val(1)
val e2 = Val(2)



def addExp2[T: Numeric](e1: Expr[T], e2: Expr[T]): Expr[_ <: T] = (e1, e2) match {
  case (Val(v1), Val(v2)) => Val(implicitly[Numeric[T]].plus(v1, v2))
  case _ => Other
}


addExp2[Int](e1, e2)

編譯時沒有任何警告。

現在我們需要的是為Expr :)的類型參數指定默認類型Nothing的方法。

問題是當你模式匹配時, Val的兩個實例可以有不同的類型參數,比如Val[T1]Val[T2]

您可以按照@rjsvaljean的建議修復它,並添加import Numeric.Implicits._以使用nice運算符表示法。

暫無
暫無

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

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