Добавление проверки действительности в зависимости от класса типов (необязательно implits)

В scala, мы можем использовать неявные классы типов для условного добавления методов к параметризованному типу в зависимости от параметров этого типа. Например, Iterator.sum :

def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)

Должен существовать экземпляр класса типов 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
                  ^

Пока все хорошо. Скажем, я хочу иметь какой-то тип коллекции, My2Col :

class My2Col[A](a1 : A, a2 : A)

Но я хочу указать это, если это делается с помощью A: Numeric , , затем a2> a1 . Тем не менее, полностью , чтобы он был сделан с A , который не является числовым.

My2Col("a", "b") //OK
My2Col("b", "a") //OK
My2Col(1, 2)     //OK
My2Col(2, 1)     //THROW IllegalArgumentException

Есть ли у кого-нибудь идеи относительно того, как я могу это сделать?

PS . Если у кого-то есть предложения по лучшему заголовку вопроса, я все слышу

7
задан oxbow_lakes 8 December 2010 в 09:04
поделиться