Que tipos de problemas ajudam o "polimorfismo de tipo superior" a resolver melhor?
Ao ler algumas seções doHistória de Haskell, Me deparei com:
No entanto, o polimorfismo de tipo superior tem utilidade independente: é inteiramente possível, e ocasionalmente muito útil, declarar tipos de dados parametrizados em tipos superiores, como:
data ListFunctor f a = Nil | Cons a (f a)
Sabendo as ADTs "básicas", fiquei um pouco confuso aqui, meu "palpite" foi que a parte em parens sugere uma "dinâmica" / "paramétrica"construtor de dados unário f
? Portanto, qualquer construtor de dados do tipo* -> *
que "pode aceitar" o tipoa
? Meu pensamento está correto ou estou interpretando mal a sintaxe? Sei que estou "apenas adivinhando", mas espero obter uma intuição de "programador leigo" sobre esse recurso aqui, algum exemplo de cenário que precisa (ou se beneficia imensamente disso) disso;) principalmente que posso imaginar (apenas não no que maneira exata), permitindo mais flexibilidade naquelas "pequenas linguagens de configuração versáteis incorporadas e recursáveis" -ADTs que Haskell gosta de formular e escreverevals
por .. perto?
No GHCi,:i ListFunctor
no exposto acima:
type role ListFunctor representational nominal
data ListFunctor (f :: * -> *) a = Nil | Cons a (f a)
Portanto, isso parece ser o que é "inferido" do crisperdata
declaração.