Класс типов

Класс типов (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 предлагает дополнительные функции, которые делают работу с ними очень удобной. Эти дополнительные функции, относящиеся к категории контекстуальных абстракций, рассматриваются в одной из последующих глав.


Ссылки: