Насколько я знаю, в Haskell только типы содержат значения, а не конструкторы типов. Either
— это конструктор бинарного типа вида * -> * -> *
. Left
и Right
оба применяют этот конструктор типа к одному типу, который предоставляется переданным значением. Не означает ли это, что в обоих случаях Either
применяется лишь частично и, таким образом, остается конструктором типа, ожидающим отсутствующий аргумент типа?
let x = Right 'x' -- Either a Char
x
имеет тип Either a Char
. Я бы предположил, что этот тип будет иметь вид * -> *
. Это явно полиморфный тип, а не наземный. Тем не менее, Either a Char
может содержать такие значения, как 'x'
.
Я подозреваю, что переменная типа a
является фантомным типом для случая Right
соответственно. b
за Left
. Я знаю фантомные типы в связи с Const
, где соответствующая переменная типа вообще не используется. Я на правильном пути?
Either Char
— это конструктор типа* -> *
.Either Char a
— это тип (типа*
) — это сокращение отforall a . Either Char a
; это должен быть тип, потому что каждыйforall
является типом (имеет вид*
). Ни одна из переменных типа вEither a b
не может быть фантомной, так как если у вас естьx :: Either a b
, то внутри может содержатьсяa
или может бытьb
; вы можете обнаружить, чтоa
нет, только с помощью сопоставления с образцом. - person user2407038   schedule 15.11.2017