«Алгебраические типы данных» в Haskell поддерживают полный параметрический полиморфизм , который является более технически правильным именем для дженериков, в качестве простого примера тип данных списка:
data List a = Cons a (List a) | Nil
Эквивалентно (насколько это возможно, без учета нестрогой оценки и т. Д.)
class List<a> {
class Cons : List<a> {
a head;
List<a> tail;
}
class Nil : List<a> {}
}
Конечно, система типов Haskell позволяет более ... интересно использовать параметры типа, но это всего лишь простой пример. Что касается имени «алгебраического типа», я, честно говоря, никогда не был полностью уверен в точной причине, по которой они названы так, но предположил, что это связано с математической основой системы типов. Я верю , что причина кроется в теоретическом определении ADT, являющегося "продуктом набора конструкторов", однако прошло несколько лет с тех пор, как я сбежал из университета, поэтому я больше не могу вспомнить особенности .
[Редактировать: Спасибо Крису Конвею за указание на мою глупую ошибку, ADT, конечно, являются типами сумм, конструкторами, предоставляющими продукт / кортеж полей]