Sto cominciando a capire come forall
viene utilizzata la parola chiave nei cosiddetti "tipi esistenziali" come questo:
data ShowBox = forall s. Show s => SB s
Questo è solo un sottoinsieme, tuttavia, di come forall
viene utilizzato e semplicemente non riesco a pensare al suo uso in cose come questa:
runST :: forall a. (forall s. ST s a) -> a
O spiegando perché questi sono diversi:
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
O tutto il RankNTypes
resto ...
Tendo a preferire un inglese chiaro e privo di gergo piuttosto che i tipi di lingua che sono normali negli ambienti accademici. La maggior parte delle spiegazioni che cerco di leggere su questo (quelle che posso trovare attraverso i motori di ricerca) hanno questi problemi:
- Sono incompleti. Spiegano una parte dell'uso di questa parola chiave (come "tipi esistenziali") che mi fa sentire felice finché non leggo il codice che lo usa in un modo completamente diverso (come
runST
,foo
ebar
sopra). - Sono densamente pieni di ipotesi secondo cui ho letto le ultime notizie su qualunque ramo della matematica discreta, teoria delle categorie o algebra astratta sia popolare questa settimana. (Se non leggo mai più le parole "consulta il documento qualunque per i dettagli dell'implementazione", sarà troppo presto.)
- Sono scritti in modi che spesso trasformano anche semplici concetti in grammatica e semantica tortuosamente distorte e fratturate.
Così...
Alla domanda reale. Qualcuno può spiegare completamente la forall
parola chiave in un inglese semplice e chiaro (o, se esiste da qualche parte, indicare una spiegazione così chiara che ho perso) che non presume che io sia un matematico intriso di gergo?
Modificato per aggiungere:
Ci sono state due risposte di spicco tra quelle di qualità superiore di seguito, ma sfortunatamente posso scegliere solo una delle migliori. La risposta di Norman fu dettagliata e utile, spiegando le cose in un modo che mostrava alcune delle basi teoriche di forall
e allo stesso tempo mostrandomi alcune delle implicazioni pratiche di esso. la risposta di Yairchu riguardato un'area che nessun altro ha menzionato (variabili di tipo con ambito) e ha illustrato tutti i concetti con codice e una sessione GHCi. Se fosse possibile selezionare entrambi i migliori, lo farei. Sfortunatamente non posso e, dopo aver esaminato da vicino entrambe le risposte, ho deciso che Yairchu è leggermente in contrasto con quello di Norman a causa del codice illustrativo e della spiegazione allegata. Questo è un po 'ingiusto, tuttavia, perché in realtà avevo bisogno di entrambe le risposte per capirlo al punto che forall
non mi lascia un debole senso di terrore quando lo vedo in una firma di tipo.