Death to type classes
Смерть классам типов!
Числа пасутся? Функторы поют? Нет — это ложь элит. Backpack вместо классов: сигнатуры модулей, а не class.
signature Functor (Functor, map) where
data Functor a
map :: (a→b) → Functor a → Functor b
Реализация для Maybe:
module Functor.Maybe where
type Functor = Maybe
map f (Just x) = Just (f x)
map _ Nothing = Nothing
Cabal: сигнатуры в library, реализации в library impl. Подмена через mixins:
mixins: death (Functor.Sig as Functor.Maybe)
Можно много реализаций в одном проекте: List, Maybe, IO — всё живёт рядом, без {-# LANGUAGE RebindableSyntax #-} не обойтись.
Итог: вместо классов — модули, вместо инстансов — реализации. Композиция через Backpack, а не instance.