O que exatamente é o tipo "*" em Haskell?
Em Haskell, expressões (em nível de valor) são classificadas emtipos, que pode ser anotado com::
igual a:3 :: Int
, "Hello" :: String
, (+ 1) :: Num a => a -> a
. Da mesma forma, os tipos são classificados emtipos. No GHCi, você pode inspecionar o tipo de uma expressão de tipo usando o comando:kind
ou:k
:
> :k Int
Int :: *
> :k Maybe
Maybe :: * -> *
> :k Either
Either :: * -> * -> *
> :k Num
Num :: * -> Constraint
> :k Monad
Monad :: (* -> *) -> Constraint
Existem definições flutuando em torno disso*
é o tipo de "tipos concretos" ou "valores" ou "valores de tempo de execução". Veja, por exemplo,Learn You A Haskell. Quão verdadeiro é isso? Nós tivemosum pouco questões sobre tipos que abordam o tópico de passagem, mas seria bom ter uma explicação canônica e precisa de*
.
o queexatamente faz*
significar? E como isso se relaciona com outros tipos mais complexos?
Além disso, faça oDataKinds
ouPolyKinds
extensões mudam a resposta?