Вас обманывают. Вы думаете, что когда вы пишете data A=Int|Bool
, вы говорите, что значение типа A
может быть значением типа Int
или значением типа Bool
; но вы на самом деле говорите, что есть два новых конструктора уровня значений с именами Int
и Bool
, каждый из которых вообще не содержит информации, типа A
. Точно так же вы думаете, что data AB=A|B
говорит, что вы можете иметь либо тип A
, либо тип B
, но на самом деле вы говорите, что вы можете иметь либо значение A
, либо значение B
.
Главное, о чем следует помнить, это то, что существует два пространства имен, уровень типов и уровень терминов, и что они различны.
Вот простой пример того, как это сделать правильно:
data A=A
data B=B
data AB=L A|R B
В последней строке объявляются два новых конструктора уровня терминов, L
и R
. Конструктор L
содержит значение type A
, а конструктор R
содержит значение type B
.
Вам также может понравиться тип Either
, определяемый следующим образом:
data Either a b = Left a | Right b
Вы можете использовать это для реализации своего AB
, если хотите:
type AB = Either A B
Точно так же вы можете использовать Either Int Bool
для объединения тегов Int
и Bool
.
person
Daniel Wagner
schedule
12.09.2015