Проблема с тем, что вы пытались сделать, заключается в том, что Euro
, Dollar
и Yen
, определенные в первых 3 строках (слева от знаков =
), являются типами , тогда как в последней строке справа указаны конструкторы данных . Это разные вещи, поэтому вам разрешено давать им одинаковые имена, но это также означает, что значение Dollar
имеет тип Currency
, а не типDollar
.
У вас была правильная идея создать тип объединения, сочетающий остальные три, - но вы путаете конструкторы данных (которые являются просто «тегами») с типами значений, которые они содержат. Вы можете исправить это так:
data Currency = Euro Euro | Dollar Dollar | Yen Yen
Может показаться странным, что одно и то же имя встречается дважды (тоже трижды), но два вхождения имени имеют разные значения. Например, в Euro Euro
первый Euro
- это конструктор данных (функция, которая «маркирует» значение), а второй - тип , с которым работает функция конструктора.