Könnte jemand die Motivation hinter dem Grenzwert für die Förderung von Datentypen, der in Abschnitt 7.9.2 of the GHC user guide diskutiert wird, erklären oder erraten?Motivation für die Beschränkung der Förderung von Daten
Die folgenden Einschränkungen gelten für die Förderung:
- Wir haben leider nur Datentypen, deren Arten fördern, sind von der Form
* -> ... -> * -> *
. Insbesondere fördern wir keine höherwertigen Datentypen wiedata Fix f = In (f (Fix f))
oder Datentypen, deren Arten promoted Typen wieVec :: * -> Nat -> *
betreffen.
Insbesondere ist ich in dem letzten Bit über geförderte Typen wie Vec :: * -> Nat -> *
interessiert. Einige Arten wie diese zu fördern scheint natürlich. Ich lief sehr schnell in es, während ich versuchte, eine meiner Bibliotheken zu konvertieren, um bestimmte geförderte Arten für die verschiedenen Phantom-Typen zu verwenden, statt die Art *
für alles zu verwenden, um bessere Dokumentation und dergleichen bereitzustellen.
Oft die Gründe für Compiler Einschränkungen wie diese springen auf Sie mit ein wenig Nachdenken, aber ich sehe das nicht. Ich frage mich also, ob es in der Kategorie "noch nicht gebraucht, also wir haben es nicht gebaut" oder "das ist unmöglich/unentscheidbar/zerstört Inferenz" kommt.
Große Erklärung, vielen Dank. –
+1 für eine viel bessere Antwort als meine, wirkt heterogene Gleichheit nur GADTs? – jozefg
Prost! GADTs sind der Hauptort, an dem Gleichheitsbeschränkungen eingeführt werden, aber manchmal tauchen sie auch in Instanzdeklarationen auf. Es gibt diesen Trick, wo man Sachen wie 'instance (x ~ p, C t) => C (x -> t)' macht, um eine aggressivere Verpflichtung zu erzwingen als 'instance C t => C (p -> t) '. Ich wette, heterogene Gleichheit wird sich auch in solchen Dingen zeigen. – pigworker