Der Code
%Vor%kann auf GHC 8.0 mit dem Fehler
nicht kompiliert werden %Vor% Wenn Sie also AllowAmbiguousTypes
hinzufügen, wird der Code kompiliert.
Hier sind meine Fragen:
AllowAmbiguousTypes
? AllowAmbiguousTypes
mir mehr gibt, als ich wirklich in diesem speziellen Code möchte. Es klingt beängstigend. Es klingt, als würde es Haskells Typensystem weniger sicher machen, vielleicht in anderen Bereichen, die nichts mit diesem speziellen Code zu tun haben. Sind diese Ängste unbegründet? a0
einzufügen, nach der ich nie gefragt habe. Gibt es keine Erweiterung, um Haskell zu ersuchen, diese überflüssigen Variablen nicht zu erzeugen - und nur diejenigen zu verwenden, die ich explizit mit meinem expliziten forall a
? AllowAmbiguousTypes
eine falsche Bezeichnung ist? Wäre es besser als AllowUnusedTypeVariables
? Was genau ist
AllowAmbiguousTypes
?
Aus dem die neuesten GHC-Dokumente , "ein Typ ty
ist mehrdeutig, wenn und nur wenn ((undefined :: ty) :: ty)
die Überprüfung fehlschlagen würde". Die Erweiterung AllowAmbiguousTypes
deaktiviert nur diese Prüfung - es erlaubt keine schlecht typisierten Programme durch.
Warum wird dieser spezielle Code benötigt?
Um zu überprüfen, ob RealFloat a
erfüllt ist, wenn g
verwendet wird, muss GHC wissen, was a
ist. Du hast keine Möglichkeit (in Vanille Haskell 1 ) GHC mitzuteilen, was a
sein soll, da a
nirgendwo anders im Typ g
vorkommt. Keine Menge an Anmerkungen erlaubt es Ihnen, g
zu verwenden, ohne einen mehrdeutigen Variablenfehler zu erhalten.
Wenn Sie g
jedoch nicht überall verwenden, können Sie Ihren Code trotzdem kompilieren, indem Sie AllowAmbiguousTypes
aktivieren.
Ich fürchte, dass das Hinzufügen von
AllowAmbiguousTypes
mir mehr gibt, als ich wirklich in diesem speziellen Code möchte. Es klingt beängstigend. Es klingt, als würde es Haskells Typensystem weniger sicher machen, vielleicht in anderen Bereichen, die nichts mit diesem speziellen Code zu tun haben. Sind diese Ängste unbegründet?
Ja, das sind sie: Mit der Mehrdeutigkeitsprüfung können Sie Definitionen erfassen, die nicht verwendet werden können (in Vanille Haskell, die nicht TypeApplications
1 hat), ohne dass ein mehrdeutiger Variablentypfehler entsteht. Wenn Sie diese Prüfung deaktivieren, bedeutet dies nur, dass Sie die Meldungen der mehrdeutigen Typenvariable sehen, wenn Sie den Ausdruck (oder die Funktion) anstelle der Definitionsstelle verwenden.
Gibt es Alternativen? In diesem Fall scheint Haskell eine Variable vom Typ
a0
einzufügen, nach der ich nie gefragt habe. Gibt es keine Erweiterung, die Haskell veranlasst, diese Fremdvariablen nicht zu erzeugen - und nur diejenigen zu verwenden, die ich explizit mit meinem explizitenforall a
hinzugefügt habe?
Das a0
kommt von der Mehrdeutigkeitsprüfung, die ich am Anfang dieser Antwort erwähnt habe. GHC verwendet nur den Namen a0
, um deutlich zu machen, dass es sich von a
unterscheidet. Die Mehrdeutigkeitsprüfung versucht im Grunde nur,
AllowAmbiguousTypes
entfernt diese Prüfung. Ich glaube nicht, dass es eine Erweiterung gibt, die Mehrdeutigkeitsprüfungen nur bei Typ-Signaturen mit explizitem forall
s deaktiviert (obwohl das vielleicht ordentlich und nützlich wäre!).
Würdest du sagen, dass
AllowAmbiguousTypes
eine falsche Bezeichnung ist? Wäre es besser alsAllowUnusedTypeVariables
benannt worden?
Dinge zu benennen ist schwer. :)
Der aktuelle Name verweist auf die Art der Fehler, die Sie erhalten, ohne dass die Erweiterung aktiviert ist. Es handelt sich also nicht um einen schlechten Namen. Ich denke, das ist eine Frage der Meinung. (Viele Leute wünschen sich auch, dass Monad
etwas wie FlatMapAble
heißt.)
1 Vor TypeApplications
(was eine relativ neue Erweiterung von GHC 8.0 ist) gab es wirklich keine Möglichkeit, Ausdrücke zu verwenden, die die Mehrdeutigkeitsprüfung ausgelöst haben, ohne einen mehrdeutigen Variablenfehler zu bekommen AllowAmbiguousTypes
war viel weniger nützlich.