Constraint-basierte Typinferenz mit algebraischen Daten


11

Ich arbeite an einer ausdrucksbasierten Sprache der ML-Genealogie, daher ist natürlich eine Typinferenz erforderlich> :)

Jetzt versuche ich, eine auf Einschränkungen basierende Lösung für das Problem der Ableitung von Typen zu erweitern, die auf einer einfachen Implementierung in EOPL (Friedman und Wand) basiert, aber sie sind elegant algebraische Datentypen.

Was ich bisher habe, funktioniert reibungslos; wenn ein Ausdruck eist a + b, e : Int, a : Intund b : Int. Wenn ees ein Match ist,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

Ich kann mit Recht annehmen , dass die t(e) = t(the whole match expression), t(n) = t(0) = t(n'), t(match) = t(1) = t(n' * fac(n - 1)und so weiter ...

Bei algebraischen Datentypen bin ich mir jedoch sehr unsicher. Angenommen, eine Funktion wie filter:

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

Damit der Listentyp polymorph bleibt, muss Cons vom Typ sein a * a list -> a list. Um diese Einschränkungen festzulegen, muss ich natürlich diese Typen meiner algebraischen Konstruktoren nachschlagen - das Problem, das ich jetzt habe, ist die "Kontextsensitivität" der mehrfachen Verwendung algebraischer Konstruktoren - wie drücke ich in meinen Einschränkungsgleichungen aus, dass die ain muss jeder Fall der gleiche sein?

Ich habe Probleme, eine allgemeine Lösung dafür zu finden, und ich kann nicht viel Literatur dazu finden. Immer wenn ich etwas Ähnliches finde - Ausdrucksbasierte Sprache mit Constraint-basierter Typinferenz - hören sie kurz vor algebraischen Datentypen und Polymorphismus auf.

Jede Eingabe wird sehr geschätzt!


@Guy Ich will nicht undankbar klingen, aber ich suche keine Standardlösung - haben Sie Vorschläge? Die meisten vorhandenen Dokumente, die ich finden konnte (wie die INRIA-Papiere zu ML, OCaml ...), sind viel umfangreicher als das, was ich brauche (und verstehen kann).
Kris

Ich würde mit dem Inferenzkapitel in ATTAPL beginnen . Ich denke, sie diskutieren alles, was Sie brauchen, auf einer zugänglichen Ebene.
Gilles 'SO - hör auf böse zu sein'

@ Gilles Ich denke, ATTAPL ist das einzige "klassische" PL-Buch, das ich nicht in meinem Bücherregal habe: P Aber danke, ich werde am Montag einen Blick darauf werfen, ich sitze auf einer Etage an der Uni mit vielleicht 10 Exemplaren, die über die Büros verteilt sind: )
Kris

@Kris haben Sie jemals eine zugängliche Ressource gefunden, die dieses Problem angeht? Meine Implementierung einer "Mini-ML" steckt genau in diesem Problem ... Ich glaube, ich habe das relevante Kapitel von ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) gefunden und den Abschnitt über Algebra überflogen Datentypen, aber ich fürchte, es ist ein bisschen über meinem Kopf.
michiakig

@spacemanaki Ja, ich habe seitdem festgestellt, dass pdfs.semanticscholar.org/8983/… eine ausgezeichnete Ressource für genau dies ist.
Kris

Antworten:


2

Siehe: Mini ML Speziell im Abschnitt Typinferenz.

Dieser enthält Beispielcode in F # für einen vollständigen Parser einer einfachen Funktionssprache. Noch wichtiger ist, dass der Abschnitt Typinferenz den Hindley-Milner-Algorithmus implementiert, der in den meisten Typinferenzsystemen zu finden ist. Der Autor bietet auch Links zu zwei anderen wichtigen Dokumenten, um das Verständnis von Hindley-Milner zu erleichtern. Eine ist eine Art Einführung auf hoher Ebene und die andere ist ein Artikel, der die Implementierung des Algorithmus in Code beschreibt.


Einzelne Links sind in der Regel keine Antwort. Bitte erläutern Sie, was dort zu finden ist und warum es hilft.
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.