Класс типов
Класс типов (type class) — это абстрактный параметризованный тип,
который позволяет добавлять новое поведение к любому закрытому типу данных без использования подтипов.
Если вы пришли с Java, то можно думать о классах типов как о чем-то вроде java.util.Comparator[T]
.
В статье "Type Classes as Objects and Implicits" (2010 г.) обсуждаются основные идеи, лежащие в основе классов типов в Scala. Несмотря на то, что в статье используется более старая версия Scala, идеи актуальны и по сей день.
Этот стиль программирования полезен во многих случаях, например:
- выражение того, как тип, которым вы не владеете, например, из стандартной или сторонней библиотеки, соответствует такому поведению
- добавление поведения к нескольким типам без введения отношений подтипов между этими типами (например, когда один расширяет другой)
В Scala 3 классы типов — это просто trait-ы с одним или несколькими параметрами типа, например:
trait Show[A]:
def show(a: A): String
Экземпляры Show
для определенного типа A
свидетельствуют о том,
что мы можем показать (т.е. создать текстовое представление) экземпляр типа A
.
Например, рассмотрим следующий экземпляр Show
для Int
:
class ShowInt extends Show[Int]:
def show(a: Int) = s"The number is ${a}!"
Можно написать методы, которые работают с произвольными типами A
, ограниченными Show
, следующим образом:
def toHtml[A](a: A)(showA: Show[A]): String =
"<p>" + showA.show(a) + "</p>"
То есть toHtml
можно вызывать с произвольным A
, если также предоставить экземпляр Show[A]
.
Например, метод можно вызвать так:
toHtml(42)(ShowInt())
// res0: String = "<p>The number is 42!</p>"
Автоматическая передача экземпляров класса типов
Поскольку классы типов являются очень важным способом структурирования программного обеспечения, Scala 3 предлагает дополнительные функции, которые делают работу с ними очень удобной. Эти дополнительные функции, относящиеся к категории контекстуальных абстракций, рассматриваются в одной из последующих глав.
Ссылки: