В выражениях Haskell выражения (value-level) классифицируются по типам, которые могут быть отмечены с помощью ::
например: 3 :: Int
, "Hello" :: String
, (+ 1) :: Num a => a → a
, Аналогичным образом типы классифицируются по видам. В GHCi вы можете проверить тип выражения типа с помощью команды :kind
или :k
:
> :k Int
Int :: *
> :k Maybe
Maybe :: * -> *
> :k Either
Either :: * -> * -> *
> :k Num
Num :: * -> Constraint
> :k Monad
Monad :: (* -> *) -> Constraint
Существуют определения, плавающие вокруг этого *
- это вид "конкретных типов" или "значений" или "значений времени выполнения". См. Например, " Learn You A Haskell". Насколько это верно? У нас было несколько вопросов о типах, которые проходят мимо темы, но было бы неплохо иметь каноническое и точное объяснение *
.
Что именно означает *
? И как это относится к другим более сложным видам?
Кроме того, изменения DataKinds
или PolyKinds
меняют ответ?