Я запутался в конструкторе типа Data.Functor.Constant, а также о том, как он работает с аппликативным.
Сначала конструктор:
Когда я исследую тип Constant :: a -> Constant a b
Я вижу, что он принимает a
, но возвращает Constant a b
Откуда возникает b
и почему он существует?
Во-вторых, я борюсь с Аппликатором:
Я понимаю, что константа должна иметь моноид внутри, чтобы быть аппликативным экземпляром.
Закон, которому он должен подчиняться, равен: pure id <*> Constant x = x
Я думал, что это то же самое, что: Constant id <*> Constant x = x
но я думаю, что я ошибаюсь в этом, так как в следующем коде явно проявляются чистые действия по-разному.
:t pure id <*> Constant "hello" // Constant [Char] b
:t Constant id <*> Constant "hello" // Couldn't match expected type `a0 -> a0' with actual type `[Char]'
:t pure id <*> Constant reverse // Constant ([a] -> [a]) b
:t Constant id <*> Constant reverse // Constant ([a] -> [a]) b
Я вижу, что он работает только в том случае, если x
является одним и тем же моноидом, если я не использую чистый. Поэтому я не уверен, почему чистая работа по-другому. Я подозреваю, что это связано с тем, что b
, поэтому они находятся в одном и том же вопросе.
Подведем итог двум вопросам:
-
Что делает
b
в конструкторе Constant? -
Почему чистая работа, даже если моноиды различны внутри?
Большое спасибо!