Ich beginne zu verstehen, wie die forall
Schlüsselwort wird in so genannten "existenziellen Typen" wie diesem verwendet:
data ShowBox = forall s. Show s => SB s
Dies ist jedoch nur eine Teilmenge dessen, wie forall
verwendet wird, und ich kann mir einfach nicht vorstellen, dass es in solchen Dingen verwendet wird:
runST :: forall a. (forall s. ST s a) -> a
Oder zu erklären, warum diese unterschiedlich sind:
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
Oder die ganze RankNTypes
Zeug...
Ich neige dazu, klares, jargonfreies Englisch zu bevorzugen und nicht die Art von Sprache, die im akademischen Umfeld üblich ist. Die meisten Erklärungen, die ich zu diesem Thema zu lesen versuche (die, die ich über Suchmaschinen finden kann), haben diese Probleme:
- Sie sind unvollständig. Sie erklären einen Teil der Verwendung dieses Schlüsselworts (wie "existentielle Typen"), was mich glücklich macht, bis ich Code lese, der es auf eine völlig andere Weise verwendet (wie
runST
,foo
ybar
oben). - Sie sind vollgepackt mit Annahmen, dass ich den neuesten Stand der diskreten Mathematik, der Kategorientheorie oder der abstrakten Algebra gelesen habe, der diese Woche populär ist. (Wenn ich nie die Worte "konsultieren Sie das Papier" lese was auch immer für die Einzelheiten der Umsetzung" noch einmal nachfragen, wird es zu früh sein).
- Sie sind in einer Art und Weise geschrieben, die häufig selbst einfache Konzepte in eine verschlungene und gebrochene Grammatik und Semantik verwandelt.
Also...
Nun zu der eigentlichen Frage. Kann jemand vollständig erklären, wie die forall
Schlüsselwort in klarem, einfachem Englisch (oder, falls es irgendwo existiert, weisen Sie auf eine solche klare Erklärung hin, die ich übersehen habe), die nicht voraussetzt, dass ich ein Mathematiker bin, der in den Fachjargon vertieft ist?
Bearbeitet um hinzuzufügen:
Es gab zwei herausragende Antworten unter den höherwertigen Antworten, aber leider kann ich nur eine als beste auswählen. Normans Antwort war detailliert und nützlich und erklärte die Dinge auf eine Weise, die einige der theoretischen Grundlagen der forall
und zeigte mir gleichzeitig einige der praktischen Auswirkungen davon. yairchu's Antwort deckte einen Bereich ab, den sonst niemand erwähnte (scoped type variables) und illustrierte alle Konzepte mit Code und einer GHCi-Sitzung. Wäre es möglich, beides als das Beste auszuwählen, würde ich es tun. Leider kann ich das nicht, und nachdem ich mir beide Antworten genau angesehen habe, bin ich zu dem Schluss gekommen, dass die von yairchu aufgrund des anschaulichen Codes und der beigefügten Erklärung etwas besser ist als die von Norman. Das ist allerdings ein bisschen unfair, denn ich brauchte wirklich beide Antworten, um die Sache so weit zu verstehen, dass forall
lässt mich nicht mit einem leisen Gefühl des Grauens zurück, wenn ich es in einer Typoskription sehe.
11 Stimmen
Haskell-Wiki scheint bei diesem Thema recht anfängerfreundlich zu sein.
0 Stimmen
wasp-lang.dev/blog/2021/09/01/haskell-forall-tutorial ist eine recht lesenswerte Zusammenfassung (anscheinend inspiriert durch diese SO-Frage!)