Geschlossene Typfamilien und seltsame Funktionstypen

8

Tut mir leid, ich könnte mir keinen besseren Titel für die Frage vorstellen, also lies bitte weiter. Stellen Sie sich vor, dass wir eine geschlossene Familie haben, die jeden Typ auf die entsprechende Maybe abbildet, außer vielleicht selbst:

%Vor%

Wir können sogar eine Funktion mit dieser Typenfamilie deklarieren:

%Vor%

Das Abspielen in GHCi zeigt, dass es in Ordnung ist, den Typ dieser Funktionsanwendung zu bewerten:

%Vor%

Die Frage ist, ob es möglich ist, irgendeine Implementierung der Funktion doMagic mit Ausnahme von undefined bereitzustellen? Nehmen wir zum Beispiel an, dass ich jeden Wert in einen Just -Konstruktor einbinden möchte, außer Maybes, der intakt bleiben sollte, wie könnte ich das tun? Ich habe versucht, typeclasses zu verwenden, konnte aber keine kompilierbare Signatur für die doMagic-Funktion schreiben, wenn keine geschlossenen Familien verwendet wurden. Könnte mir bitte jemand helfen?

    
Anton 29.10.2014, 22:12
quelle

2 Antworten

8

Sie können eine andere geschlossene Typfamilie verwenden, um Maybe x von x zu unterscheiden, und dann können Sie eine andere Typklasse verwenden, um separate Implementierungen von doMagic für diese beiden Fälle bereitzustellen. Schnelle und schmutzige Version:

%Vor%     
Ed'ka 30.10.2014, 05:11
quelle
4

Sie können eine doMagic Funktion erstellen, die mithumpelt. Leider hilft dir die Geschlossenheit der Typfamilie nicht wirklich. So könnte ein Start aussehen

%Vor%

Sie können es in ghci so arbeiten sehen, wie Sie gefragt haben:

%Vor%

Also warum sage ich, dass es mithumpelt? Nun, Sie haben vielleicht bemerkt, dass die beiden bereitgestellten Instanzen nicht viel vom Haskell-Ökosystem der Typen abdecken:

%Vor%

Also müsste man Instanzen für jeden Typ (Konstruktor) von Interesse bereitstellen. Tatsächlich helfen hier nicht einmal inkohärente Instanzen - der Club, mit dem viele solcher Probleme in die Unterwerfung geschlagen werden können -; wenn man versucht zu schreiben

%Vor%

Der Compiler beklagt zu Recht, dass wir schließlich nicht wissen, dass die vollpolymorphe Instanz tatsächlich den richtigen Typ hat. Die Sache mit inkohärenten Instanzen ist, dass dem Compiler nicht gesagt wird, dass, nur weil das die Instanz gewählt wurde, die anderen Instanzen definitiv nicht sind. Es ist also möglich, dass wir die vollständig polymorphe Instanz irgendwann auswählen, um später festzustellen, dass wir tatsächlich ein Maybe hinter den Kulissen waren, und dann haben wir einfach eine zu viele Ebenen von Maybe um die Dinge gewickelt. Unglücklich.

Im Moment kann dazu nicht viel getan werden. Geschlossene Familien bieten derzeit nicht das gesamte Wissen, das man sich wünschen könnte. Vielleicht wird GHC eines Tages einen Mechanismus anbieten, der Familien mit geschlossenem Typ in dieser Hinsicht nützlicher macht, wie zum Beispiel eine Ungleichung der Typenungleichheit, aber ich würde nicht den Atem anhalten: Es ist ein Forschungsproblem, wie man diese nützliche Information zur Verfügung stellt. Ich habe Gerüchte gehört, dass Leute es angepackt haben.

    
Daniel Wagner 30.10.2014 04:41
quelle

Tags und Links