Em Haskell, os “tipos de classe superior” são realmente tipos? Ou eles apenas denotam coleções de tipos * concretos * e nada mais?
Considere a seguinte função:
f :: a -> Int
f x = (1 :: Int)
Podemos dizer que o tipo def
éa -> Int
, e essaf
portanto, é do tipo "polimórfico".
Qual das alternativas a seguir é a maneira mais precisa de pensarf
?
Existe de fato umsolteiro f
do tipoa -> Int
. No entanto, pode ser usado como umf :: Int -> Int
, comof :: Double -> Int
, e assim por diante.
Literalmente falando, o tipo def
não éa -> Int
. De fato, essa é apenas uma maneira abreviada de dizer que existe umafamília de funçõesf
cujo tipo é concreto (ou seja, existe umf :: Int -> Int
, af :: Double -> Double
, e assim por diante; além disso, cada uma dessas funções é distinta uma da outra).
Da mesma forma, podemos considerar a seguinte declaração de tipo:
data Maybe a = Just a | Nothing
E pergunte qual das duas visualizações é mais correta:
Não hásolteiro tipoMaybe
; de fato, existe apenas uma família de tipos concretos (Maybe Int
, Maybe String
, etc) e nada mais.
Há simde fato um único tipoMaybe
. Esse tipo é do tipo superior. Quando dizemos que é um "tipo", queremos dizer isso literalmente (não como uma abreviação de (1)). Acontece que também podemos escreverMaybe Int
, Maybe Double
e assim por diante para gerardistinto tipos (que são concretos). Mas, no final do dia (ou seja):Maybe
, Maybe Int
eMaybe String
denotartrês tipos distintos, dois dos quais são concretos e um dos de maior qualidade.
Em Haskell, os "tipos de classe superior" são realmente tipos? Ou são apenas os tipos concretos "os tipos reais" e, quando falamos de "tipos superiores", estamos apenas denotando umfamília de tipos de concreto. Além disso, as funções paramametralmente polimórficas denotam funções de umtipo únicoou elesapenas denotar umcoleção funções detipos de concreto (e nada mais)?