Введение
Я понимаю разницу между Maybe a
и Maybe Int
, я также понимаю разницу между Either a b
и Either Int Int
. Я также понимаю, что Either Int
является тем же самым видом животных, что и Maybe
, оба они берут тип в качестве аргумента и создают новый тип, т.е. Они являются конструкторами типа, которые принимают один тип как параметр (либо конкретный, как Int или а не бетона типа a
) и производить либо конкретный тип, либо полиморфный тип.
Теперь, что я не понимаю, какова конструкция Either a
? Это не похоже на Maybe
, потому что он никогда не сможет создать конкретный (читаемый не полиморфный) тип, если мы будем подсылать ему конкретный тип (например, Int
). Поэтому в этом случае правильно ли вызывать Either a
конструктор полиморфного типа и вызывать Maybe
конструктор конкретного типа? (Это как я их называю, каково их официальное название в номенклатуре Haskell?)
Кроме того, я не знаю, что такое официальная классификация в системе типа Haskell конструкторов типа типа Either a
, потому что она не может быть в той же категории, что и Maybe
, потому что, как упоминалось в предыдущем абзаце, независимо от того, какой тип мы применяем Either a
, результирующий тип никогда не будет конкретным типом, т.е. он всегда будет полиморфным типом, например Either a Int
.
Причина, по которой я спрашиваю об этом, состоит в том, что Either a
является Functor
. Что начинает запутываться. Ничего похожего на то, что я видел раньше. Я не знаю, как я должен концептуально интерпретировать тот факт, что Either a
(конструктор полиморфного типа) является экземпляром Functor
? Аналогично, (->) r
(который также является тем же самым видом животных, что и Either a
) также является Functor
.
Вопросы:
Что такое Either a
и (->) r
?
Что они называли официально?
Как они концептуально вписываются в систему типов Haskell?
Где эти конструкторы полиморфного типа описаны/обсуждены более подробно?
Чему бы я читал, поэтому я лучше понимаю их?
Должен ли я читать о видах? Являются ли виды секретным способом понимания таких конструкторов полиморфного типа как Either a
и (->) r
?
Является ли Either a Int
тем же видом животных, что и [a]
?
Единственная цель Either a Int
объявить полиморфные типы ввода и вывода для функций, как и в случае [a]
в fmap :: (a -> b) -> [a] -> [b]
?
Самый важный вопрос:
Как я должен интерпретировать следующий код в свете описанных выше мыслей?
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
class Functor f where
fmap :: (a -> b) -> f a -> f b
Таким образом, результирующая функция fmap
(тип которой fmap :: (a -> b) -> Either c a -> Either c b
) будет полиморфна в c
?
Это единственный эффект от создания Either a
экземпляра Functor
?
Так что результирующая функция fmap
будет полиморфна в c
?
По сравнению с, например, делая Either Int
экземпляр Functor
?
Тогда полученный fmap
будет работать только на типах Either Int a
, но не будет работать вообще/полиморфно на всех типах Either a b
?
Если я правильно понимаю, это единственная точка и цель создания конструкторов полиморфного типа типа Either a
? Итак, fmap
работает со всеми типами Either a b
?
Я смущен, и я не уверен, правильно ли я интерпретирую Either a
. Может кто-нибудь, пожалуйста, подтвердите, что 1) либо моя интерпретация верна 2) если нет, тогда, пожалуйста, просветите меня.
Спасибо за чтение.