Estoy empezando a entender cómo forall
se usa la palabra clave en los llamados "tipos existenciales" como este:
data ShowBox = forall s. Show s => SB s
Sin embargo, esto es solo un subconjunto de cómo forall
se usa y simplemente no puedo entender cómo se usa en cosas como esta:
runST :: forall a. (forall s. ST s a) -> a
O explicando por qué son diferentes:
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
O todo el RankNTypes
asunto ...
Tiendo a preferir un inglés claro y sin jerga en lugar de los tipos de lenguaje que son normales en entornos académicos. La mayoría de las explicaciones que intento leer sobre esto (las que puedo encontrar a través de los motores de búsqueda) tienen estos problemas:
- Están incompletos Explican una parte del uso de esta palabra clave (como "tipos existenciales") que me hace sentir feliz hasta que leo el código que lo usa de una manera completamente diferente (como
runST
,foo
ybar
arriba). - Están repletos de suposiciones que he leído lo último en cualquier rama de matemáticas discretas, teoría de categorías o álgebra abstracta que es popular esta semana. (Si no leí las palabras "consultar el documento sea cual sea para los detalles de la implementación" de nuevo, será demasiado pronto.)
- Están escritos de manera que con frecuencia convierten incluso conceptos simples en gramática y semántica tortuosamente retorcida y fracturada.
Entonces...
A la pregunta real. ¿Alguien puede explicar completamente la forall
palabra clave en un inglés claro y simple (o, si existe en algún lugar, señalar una explicación tan clara que me haya perdido) que no asume que soy un matemático inmerso en la jerga?
Editado para agregar:
Hubo dos respuestas destacadas de las de mayor calidad a continuación, pero desafortunadamente solo puedo elegir una como la mejor. La respuesta de Norman fue detallada y útil, explicando las cosas de una manera que mostró algunos de los fundamentos teóricos forall
y al mismo tiempo me mostró algunas de las implicaciones prácticas de la misma. la respuesta de yairchucubrió un área que nadie más mencionó (variables de tipo de ámbito) e ilustró todos los conceptos con código y una sesión de GHCi. Si fuera posible seleccionar ambos de la mejor manera, lo haría. Desafortunadamente, no puedo y, después de mirar detenidamente ambas respuestas, he decidido que Yairchu supera ligeramente a Norman debido al código ilustrativo y la explicación adjunta. Sin embargo, esto es un poco injusto, porque realmente necesitaba ambas respuestas para entender esto hasta el punto que forall
no me deja con una leve sensación de temor cuando lo veo en una firma de tipo.