Как предположили Луис и jwvh, вы можете использовать класс типов Ordering
, но я хотел бы представить вам шаблон классов типов и использовать классы типов для ограничения более глубокого использования функции.
Класс типов позволяет быть гибким в своих родовых типах c, ограничивая его настолько, чтобы те, у кого нет экземпляра класса типов, не могли использовать вашу функцию.
Возьмите это в качестве примера, предполагая, что числовые типы данных в Scala не имеют операторов, мы можем обобщить идею работы с ними, введя класс типов Num
, а затем указав их поведение в операции, поскольку эти числовые типы данных имеют разные способы обработки алгебраических операций c. (например, Integral против действительного числа)
trait Num[A] {
def add(l: A, r: A): A
def sub(l: A, r: A): A
def mul(l: A, r: A): A
def div(l: A, r: A): A
}
object NumTest {
def addThenMultiply[A](l: A, r: A)(implicit ev: Num[A]): A =
ev.mul(ev.add(l, r), r)
//then we create Num instances for numerical types
implicit val intNum = new Num[Int] { /* implementation*/ }
implicit val floatNum = new Num[Float] { /* implementation */ }
}
Теперь в этом случае функция addThenMultiply
будет работать только для типов данных Int
и Float
, поскольку они являются единственными, которые имеют Num
экземпляр, но вы можете добавить экземпляры для других пользовательских типов данных также в зависимости от ваших потребностей.