Frage

Höhere Rang Typen aussehen großer Spaß. Aus dem Haskell Wikibook kommt dieses Beispiel:

foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)

Jetzt können wir foo id, ohne dass der Compiler explodiert bewerten. ST Monade und runST: Dieses Beispiel ist in dem Buch von der realen Welt Beispiel habe ich in einigen anderen Orten gesehen schnell gefolgt. Das ist ziemlich cool.

Aber ich habe noch über eine Situation zu kommen, wo ich ein Problem lösen, indem sie meine eigene Funktion mit einem Argument von höherrangigen zu schreiben. Hast du? Welche Beispiele haben Sie von Rang-2 oder Rang-n-Polymorphismus in der freien Natur?

War es hilfreich?

Lösung

Schauen Sie sich auf Funktionen wie withRepoLock im Darcs Quelle .

Darcs hat die Unterstützung für mehrere Repository-Formate, und dass die Unterstützung über einen typeclass ausgedrückt. So können Sie Code schreiben, der über Repository-Formate generisch ist. Wenn tatsächlich eine On-Disk-Repository lesen mögen, dass Sie in diesem Code durch einigen gemeinsamen Code versenden, das, was das Repository in formatieren Figuren aus und wählt die richtige Instanziierung typeclass.

Andere Tipps

Weirich und Washburnn der "Boxen gehen Bananen!" ( Papier , Dias )

Hier ist eine sehr grobe und wahrscheinlich etwas ungenau Erklärung, was es geht um: Da ein induktiver Typ, BGB können Sie den Raum der Funktionen von dieser Art dar, die „positiv“ sind - sie nie fall diskriminieren auf ihre Argumente . Allenfalls sie sind ihre Argumente als Teil anderer Werte (in der Regel vom gleichen Typ).

Weirich + Washburn diese verwenden ein probably- ausreichend HOAS Darstellung des Lambda-Kalkül zu bekommen in -XRankNTypes Haskell (hat jemand bewiesen, dass es angemessen noch?).

Ich benutze es hier (Warnung: chaotisch Code), um ein

(forall g . GArrow g => g () x -> g () y)

in eine

(forall g . GArrow g => g x y)

Das funktioniert, weil der Rang-2 polymorphe Typ kann nicht „kontrollieren“ die Struktur des Arguments - das alles tun kann, ist „Einfügen“ dieses Arguments in größere Strukturen. Einige Tricks lässt mich herausfinden, wo das Einfügen geschieht, und dann fädeln ich die Beleimung (n) (falls vorhanden) zurück an den Eingang des GArrow .

Sie können dies mit der Control.Arrow Klasse nicht tun, weil der ganzen Haskell Funktion Raum „Lecks“ in es über arr.

Vor kurzem jemand eine Frage gestellt hier auf Stack-Überlauf die konnte mit höherrangigen Arten gelöst werden.

Eine weitere Anwendung ist in der Ihre Boilerplate Schrott Papier.

Es kann sein, dass Sie aufgetretenen Probleme haben, wo höherrangigen Arten nützlich wären, aber nicht, sie zu verwirklichen. Zum Beispiel in dem Darcs Beispiel könnten sie leicht ohne höherrangige Typen implementiert. Stattdessen würde es auf einige Funktionen gewesen Voraussetzungen haben, die der Anrufer würde sie mit, stellen Sie sicher erfüllen wie die richtige Instanz einer Funktion für das Repository-Format auswählen.

Der Vorteil der höheren Rang Art ist, dass sie die Verantwortung überträgt dieses Recht vom Programmierer an den Compiler für immer. Bei dem herkömmlichen Ansatz, wenn ein Darcs Entwickler einen Fehler mit dem Repository-Typ gemacht würde entweder das Ergebnis ein Laufzeitfehler sein oder sonst beschädigte Daten. Mit dem höheren Rang Typ bekommt der Entwickler eine Art Fehler bei der Kompilierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top