Есть ли одно слово, которое означает «нерекурсивный тип данных с двумя конструкторами»? - PullRequest
4 голосов
/ 31 августа 2011

Есть ли слово, описывающее типы данных,

  1. имеют ровно два конструктора; и
  2. не рекурсивны?

т.е. описывает эти типы

data Bool = False | True
data Maybe a = Nothing | Just a
data Either l r = Left l | Right r

но исключает эти типы

data Ordering = LT | EQ | GT  -- too many constructors
data () = ()                  -- too few constructors
data [a] = a | a : [a]        -- recursive definition

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Я думаю, что черта иметь ровно два конструктора совершенно бессмысленна.Представьте себе типы:

data StrictOrdering = LT | GT
data Ordering' = EQ | NEQ !StrictOrdering

Тип Ordering' эквивалентен упомянутому вами Ordering, отличающемуся только «2-конструктором».

С другой стороны, Maybe Bool, Either Bool Bool и Bool сильно отличаются друг от друга и, похоже, не заслуживают одного и того же имени, за исключением того, что их называют «типами сумм».

Теперь можно найти некоторые сходства между exists a. Maybe a и Bool, но чтобы указать на них, нужно больше ограничений, чем просто «2-конструктор».

2 голосов
/ 31 августа 2011

«Наличие двух конструкторов» - это свойство, которое содержит мало информации о том, что может быть представлено таким типом. Это означает, что принуждение к слабой голове-нормальной форме (WHNF) разрешает двоичный выбор в регистре. Возможно, вы могли бы назвать это «Двуглавый тип» для обозначения фразы.

Это более полезно для GHC как способ создания оптимизированного представления в оперативной памяти для данных, поскольку GHC использует тегирование указателя , которое помогает для типов до 4 конструкторов (или 8 на 64-битных машинах). ).

1 голос
/ 31 августа 2011

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

0 голосов
/ 31 августа 2011

А как насчет бинарной суммы / типа копродукции (двух типов)?

...