Estou começando a entender como a forall
palavra-chave é usada nos chamados "tipos existenciais" como este:
data ShowBox = forall s. Show s => SB s
Este é apenas um subconjunto, no entanto, de como forall
é usado e eu simplesmente não consigo entender meu uso em coisas como esta:
runST :: forall a. (forall s. ST s a) -> a
Ou explicando por que são diferentes:
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
Ou o RankNTypes
material todo ...
Eu tendem a preferir um inglês claro e sem jargões, em vez dos tipos de idioma normais em ambientes acadêmicos. A maioria das explicações que tento ler sobre isso (as que posso encontrar nos mecanismos de pesquisa) tem esses problemas:
- Eles estão incompletos. Eles explicam uma parte do uso desta palavra-chave (como "tipos existenciais") que me faz sentir feliz até que eu ler o código que usa-lo em uma maneira completamente diferente (como
runST
,foo
ebar
acima). - Eles estão densamente repletos de suposições que eu li sobre o que há de mais recente em qualquer ramo da matemática discreta, teoria das categorias ou álgebra abstrata que é popular nesta semana. (Se eu nunca mais ler as palavras "consulte o documento, para maiores detalhes sobre a implementação", será muito cedo.)
- Eles são escritos de maneiras que frequentemente transformam conceitos simples em gramática e semântica tortuosamente distorcidas e fraturadas.
Assim...
Para a questão real. Alguém pode explicar completamente a forall
palavra - chave em inglês claro e claro (ou, se existir em algum lugar, apontar para uma explicação tão clara que eu perdi) que não presuma que eu sou um matemático mergulhado no jargão?
Editado para adicionar:
Havia duas respostas destacadas das de alta qualidade abaixo, mas infelizmente só posso escolher uma como a melhor. A resposta de Norman foi detalhada e útil, explicando as coisas de uma maneira que mostrava algumas das bases teóricas forall
e, ao mesmo tempo, mostrando-me algumas das implicações práticas dela. resposta de yairchucobriu uma área que ninguém mais mencionou (variáveis de tipo com escopo definido) e ilustrou todos os conceitos com código e uma sessão do GHCi. Se fosse possível selecionar os dois da melhor maneira, eu selecionaria. Infelizmente, não posso e, depois de examinar atentamente as duas respostas, decidi que o yairchu fica um pouco mais afastado do Norman por causa do código ilustrativo e da explicação anexa. Isso é um pouco injusto, no entanto, porque realmente eu precisava das duas respostas para entender isso a tal ponto que forall
não me deixa com um leve senso de pavor quando a vejo em uma assinatura de tipo.