添加依赖于类型类的有效性检查(可选含义)

oxb*_*kes 7 scala typeclass

在scala中,我们可以使用隐式类型类有条件地将方法添加到依赖于该类型参数的参数化类型上.例如,Iterator.sum:

def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)
Run Code Online (Sandbox Code Playgroud)

Numeric甚至可以调用此方法的类型类的实例:

scala> List(1, 2, 3).sum
res0: Int = 6

scala> List("a", "b").sum
<console>:6: error: could not find implicit value for parameter num: Numeric[java.lang.String]
       List("a", "b").sum
                  ^
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.假设我想要一些集合类型,My2Col:

class My2Col[A](a1 : A, a2 : A)
Run Code Online (Sandbox Code Playgroud)

但我想强制要求,如果这是一个做A : Numeric,然后 a2 > a1.但是,使用非数字制作完全有效A.

My2Col("a", "b") //OK
My2Col("b", "a") //OK
My2Col(1, 2)     //OK
My2Col(2, 1)     //THROW IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)

有没有人想我怎么做这个?

PS.如果有人对更好的问题标题有任何建议,我会全力以赴

Vas*_*iuk 12

class My2Col[A](a1 : A, a2 : A)(implicit num: Numeric[A] = null){
  for{check <- Option(num); if(check.gteq(a1, a2))}
     throw new IllegalArgumentException
}
Run Code Online (Sandbox Code Playgroud)