scalabook

Форк
0
/
type-classes.md 
66 строк · 3.9 Кб

Класс типов

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


Ссылки:

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.