Моя первая мысль - ты делаешь это неправильно.Вместо сопоставления с шаблоном вам нужен класс типов или какой-то другой механизм (методы класса), который может выполнять динамическую диспетчеризацию на основе типов.Использование сопоставления с образцом для выполнения собственной диспетчеризации на основе типов создает беспорядочный код и мешает безопасности типов.
Вот быстрый и распространенный пример класса типов в Scala.Во-первых, определите черту, которую имеет общий класс типов:
trait Ord[T] { def compare (x: T, y: T): Boolean }
В вашем случае вы бы хотели, чтобы метод a
был методом черты.Затем для каждого типа, которому вы хотите принадлежать к классу типов, создайте для него неявный объект:
implicit object ordInt extends Ord[Int] {
def compare (x: Int, y: Int) = x <= y
}
Здесь я сделал Int
экземпляр моего класса Ord
типа.Теперь вы можете писать методы, которые полагаются на интерфейс, предоставляемый вашим классом типов.Метод должен неявно принимать конкретный объект класса типа, например, так:
def sort[T](xs: List[T])(implicit ord: Ord[T]) = {
затем вы можете использовать специальные методы класса класса, вызывая его для неявного объекта.
def sort[T](xs: List[T])(implicit ord: Ord[T]) = {
def insert(y: T, ys: List[T]): List[T] = ys match {
case Nil => List(y)
case z :: zs =>
if (ord.compare(y,z)) { y::z::zs } // <--- here I use ord.compare
else { z :: insert(y, zs) }
}
xs.foldRight(List[T]())(insert _)
}
И вуаля!У нас есть тип-ориентированная отправка, без потери безопасности типа.Хотите отсортировать список Ints?Нет проблем.Пытаетесь отсортировать список чего-то, у кого нет экземпляра Ord?Компилятор не позволит вам выстрелить себе в ногу.