Type Classes

Предния път – изрази

Пренесохме възможността за тези операции върху ефекта Future
(и стойността в него)

  • map – трансформация на единична стойност (напр. val c = -a)
  • map2, или още zipMap или zipWith – трансформация на две независими стойности (val c = a + b). Резултатът c зависи от тях
  • map3, zipMap3; mapN дефинира зависимости
  • flatMap – когато функциите в изразите са ефектни, напр. ако f и g връщат Future
  • flatMap – ефектна трансформация на единична стойност

Референтна прозрачност на eager vs lazy Future-и

> 52

Референтна прозрачност на eager vs lazy Future-и

> Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [5 seconds]

Референтна прозрачност на eager vs lazy Future-и

> 52

Тук вече няма значение дали Future-а е eager или lazy

Абстрактност

Абстрактността в математиката

Примери: групи, полета, полиноми, векторни пространства и много други

Алгебрични структури – множества със съответни операции и аксиоми (свойства)

алгебрични структури ~ тип данни

Група

Нека G е множество с бинарна операция „·“

G наричаме група, ако:

  • асоциативност – ∀ a, b, c ∈ G:

    (a · b) · c = a · (b · c)
  • неутрален елемент – ∃ e ∈ G, такъв че ∀ a ∈ G

    e · a = a · e = a
  • обратен елемент – ∀ a ∈ G, ∃ a’ ∈ G, такъв че

    a · a' = a' · a = e

Моноид

Нека M е множество с бинарна операция „·“

M наричаме моноид, ако:

  • асоциативност – ∀ a, b, c ∈ M:

    (a · b) · c = a · (b · c)
  • неутрален елемент – ∃ e ∈ M, такъв че ∀ a ∈ M

    e · a = a · e = a

Реализация?

Задача: напишете метод sum работещ с различни типове

Контекст в програмния код

в математиката: „Нека фиксираме поле F, такова че…“

в математиката: „Нека фиксираме ортогонална координатна система“

context
  1. The parts of a written or spoken statement that precede or follow a specific word or passage, usually influencing its meaning or effect;
  1. The set of circumstances or facts that surround a particular event, statement, idea, etc.
  1. “What comes with the text, but is not in the text.”

Примери

Текуща:

  • конфигурация
  • транзакция
  • сесия
  • ExecutionContext – pool от нишки

Контекст в програмния код

  • import
  • подтипов полиморфизъм
  • dependency injection
  • външен scope
  • параметри

Експлицитно предаване на контекст

Имплицитно предаване на контекст

В Scala чрез implicts

Context bound

Type class-овете дефинират операции и аксиоми/свойства, които даден тип трябва да притежава.

За да бъде един тип от даден клас, то трябва да предоставим валидна имплементация на операциите на type class-а

Аксиомите са важни

((a · b) · c) · d – едно по едно, от ляво надясно

(a · b) · (c · d) – балансирано и паралелизуемо

Могат да бъдат проверявани чрез тестове

fold vs foldLeft

fold изисква асоциативна операция

ООП класове срещу type class-ове

Класовете в ООП моделират обекти

Type class-овете моделират типове

Полиморфизъм

Използването на един и същи интерфейс с различни типове

Параметричен полиморфизъм (generics)

Ad hoc полиморфизъм

Избор на конкретна имплементация според конкретния тип

Ad hoc полиморфизъм – overloading

Ad hoc полиморфизъм – type classes

Пример: реализацията на Monoid се избира конкретно според типа

Подтипов полиморфизъм

Липсва информация за конкретния тип, но се изпълнява конкретна имплементация

Duck typing и структурно подтипизиране

Binding

  • Static (compile time) – параметричен и ad-hoc полиморфизъм
  • Late (runtime) – подтипов полиморфизъм и duck typing

Late binding-а е фундаментален за ООП

“I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages… to communicate with messages… OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.” ― Alan Kay

Ретроактивност

разширяване на тип без промяна на кода му

Ретроактивен полиморфизъм

добавяне на интерфейс към тип
без промяна на кода му

Type class-овете поддържат ретроактивен полиморфизъм

Numeric

Ordering

Сериализация до JSON

Логически изводи в типовата система

Типовата система е логическа и търсенето на implicit стойности, отговарящи на определен тип, съвпада с механиката на изводите, познати ни от логическото програмиране

Type class-ове за допълнителна информация. Compile-time type metadata

  • ClassTag – информация за класа на подадения тип
  • TypeTag – пълна типова информация, включително за generic параметрите

Езици, поддържащи type class-ове

  • Haskell
  • Scala
  • Rust
  • Idris

В Haskell всеки type class може да има само една инстанция за определен тип.

В Scala липсва такова ограничение, което е едновременно и плюс и минус.

Библиотеки за type class-ове?

Библиотеки

  • Cats
  • Spire – математически абстракции, използва Cats
  • Scalaz

Cats

Multiversal equality (Eq)

Scala with Cats

Scala with Cats

Spire – Линейно пространство

Type class-ове на повече типове

Дефинират type class релация между няколко типа

В заключение

Type class-овете:

  • моделират типове
  • предоставят общ интерфейс и аксиоми за цяло множество от типове
  • или още – общ език, чрез който да мислим и боравим с тези типове
  • позволяват ad hoc полиморфизъм
  • наблягат на композитността и декларативността
  • не изискват промяна на кода на типа и в Scala могат да бъдат контекстно-зависими