Was ist AllowAmboundyTypes und warum wird es in diesem "forall" Beispiel benötigt?

9

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:

  • Was genau ist AllowAmbiguousTypes ?
  • Warum muss dieser spezielle Code funktionieren?
  • 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?
  • 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, um Haskell zu ersuchen, diese überflüssigen Variablen nicht zu erzeugen - und nur diejenigen zu verwenden, die ich explizit mit meinem expliziten forall a ?
  • hinzugefügt habe?
  • Es wurde eine Frage wegen user2407038 s Kommentars hinzugefügt: Würden Sie sagen, dass AllowAmbiguousTypes eine falsche Bezeichnung ist? Wäre es besser als AllowUnusedTypeVariables ?
  • benannt worden
haskellHQ 16.07.2017, 12:17
quelle

1 Antwort

9
  

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 expliziten forall 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,

zu tippen %Vor%

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 als AllowUnusedTypeVariables 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.

    
Alec 13.08.2017, 21:11
quelle

Tags und Links