У меня возникают проблемы с пониманием функторов, в частности, конкретного типа в LYAH. Я считаю, что это потому, что я не понимаю, что такое []
.
fmap :: (a -> b) -> f a -> f b
- Является
[]
, конструктором типа? Или это конструктор значений? - Что значит иметь тип:
[] :: [a]
? - Это как конструктор типа
Maybe
или конструктор значенийJust
?- Если это похоже на
Just
, то как получилось, чтоJust
имеет подпись типаJust :: a -> Maybe a
, а неJust :: Maybe a
, иными словами, почему не[]
typed[] :: a -> [a]
- Если это похоже на
- LYAH говорит об этом, поскольку он применим к функторам: Обратите внимание, что мы не пишем экземпляр Functor [a] где, потому что из fmap:: (a → b) → fa → fb, мы видим, что f должен быть конструктором типа, который принимает один тип. [a] уже является конкретным типом (из списка с любым типом внутри него), а
[]
- это конструктор типа, который принимает один тип и может создавать такие типы, как [Int], [String] или даже [[String] ]. Я смущен, хотя тип[]
означает, что он похож на литерал для[a]
, к чему стремится LYAH?