Вы смешиваете конструкторы типов и данных и используете конструктор type []
(через псевдоним Empty
, где ожидается простой тип.
Рассмотрим псевдо-Haskell определение конструктора списка:
data [] a = [] | a : ([] a)
Здесь []
является как конструктором типа с типом * -> *
, так и конструктором нулевых данных с типом [a]
, представляющим пустые списки.
Для вашего типа сделайте то же самое: Zero
- это просто нулевой конструктор данных.
data E = Zero | Triple A B C
(при условии, что A
, B
и C
являются фиксированными типами. Если вы пытаетесь определить тройку произвольных типов, вам необходимо параметризовать E
:
data E a b c = Zero | Triple a b c
).