Я начал этот новый вопрос, поскольку он стал продолжением моего предыдущего вопроса.
Если у меня есть два типа данных, которые состоят из похожих конструкторов:
data A = X | Y | Z
data B = X | Y
я никак не могу как-то представить это как:
data A = C | Z
data B = C
data C = X | Y
если вы видите, что я делаю - я пытаюсь сгруппировать X | Y в один тип данных, который затем может использоваться несколькими другими типами данных. Кажется, я не могу заставить компилятор разрешить это, или если это так, я не могу сопоставлять шаблоны с X или Y, только с C??
Я получаю сообщение об ошибке, что C был объявлен несколько раз.
Я думал, что мог бы использовать типы, но они не позволяют использовать несколько типов.
РЕДАКТИРОВАТЬ
Даже если я объявлю длинный путь (как показано ниже), он все равно не скомпилируется и скажет, что X и Y имеют несколько объявлений:
data A = X | Y | Z
data B = X | Y
A
. Он не будет объявлен с ключевым словомdata
, которое создает новый тип, не пересекающийся с предыдущими существующими типами. Я не думаю, что в Haskell есть такая функция, но я не в курсе всех расширений Haskell. - person Gilles 'SO- stop being evil'   schedule 10.09.2012