Ich probiere eine sehr leichte Codierung der Kombinatorrechnung in scala aus. Zunächst implementiere ich einfach die S- und K-Kombinatoren, die Anwendung und die konstanten Werte. Später hoffe ich, die Skalafunktionen anzuheben und die Auswertung eines Ausdrucks als eine Scala-Funktion zu ermöglichen. Aber das ist für später. Hier ist, was ich bisher habe.
%Vor%Nun würde ich gerne eine Art Rückschluß darüber machen. Zur Vereinfachung der Implementierung der Verkleinerung in kleinen und großen Schritten ist das Datenmodell nicht typisiert. Daher möchte ich, dass Typen außerhalb dieser Struktur liegen. Lassen Sie uns etwas einführen, das die Typinformationen enthält.
%Vor%Der Werttyp ist einfach.
%Vor%Die Anwendung ist ein wenig komplizierter, aber im Grunde geht es um die Funktionsanwendung. Lassen Sie uns einen Typ ⊃ für die Kombinator-Anwendung einführen, um eine Verwechslung mit der normalen Scala-Anwendung zu vermeiden.
%Vor%Hier bleibe ich stecken. Ich muss den Typ der S- und K-Kombinatoren darstellen. Sie sind jedoch allgemein quantifizierte Typen. Sie kennen ihren tatsächlichen Typ erst, wenn Sie sie anwenden. Nehmen wir K als Beispiel.
%Vor%In den ersten paar Versuchen habe ich K als K [X, Y] parametrisiert, aber das ist (katastrophal) nicht ausreichend polymorph. Der Typ von K sollte auf den Typ des ersten Arguments und dann auf den nächsten warten. Wenn Sie K nur auf einen Wert anwenden, sollte der Typ des nächsten Arguments noch nicht festgelegt sein. Sie sollten in der Lage sein, (K x: X) zu nehmen und es auf eine Zeichenkette oder auf einen int oder einen beliebigen Typ anzuwenden, den Sie mögen.
Also ist mein Problem, wie man das implizite schreibt, das den typeOf für S und K erzeugt und wie man die ∀-quantifizierten Typen korrekt behandelt. Vielleicht möchte ich so etwas?
%Vor%Allerdings bin ich mir nicht sicher, wie ich den ∀-Typ schreiben soll, um die Rohrleitungen zu machen. Ich habe das Gefühl, dass zusätzlich zu getting ein zweites implizites für typeOfAp existiert, um den A # typeOf =: = ∀ [...] Fall zusätzlich zu dem ausgehenden A # typeOf =: = ⊃ [ ...] eins.
Danke,
Matthäus
Tags und Links scala type-inference implicit combinatory-logic