Abhängig eingegebene Warteschlange in Haskell

9

Ich habe versucht, meine eigene Frage zu Beispielen zu beantworten, die die Erweiterung PolyKinds in GHC verwenden und kam auf ein konkreteres Problem. Ich versuche, eine Warteschlange zu modellieren, die aus zwei Listen aufgebaut ist: der Kopfliste, aus der die dequeue Elemente abruft, und der Nachschlageliste, in die sie enqueue legt. Um das interessant zu machen, habe ich beschlossen, eine Beschränkung hinzuzufügen, dass die Schwanzliste nicht länger sein darf als die Kopfliste.

Es scheint, dass enqueue verschiedene Typen zurückgeben muss, wenn die Warteschlange ausgeglichen sein soll oder nicht. Ist es überhaupt möglich, mit dieser Einschränkung den richtigen Typ für die Funktion enqueue zu geben?

Der Code, den ich derzeit habe, ist hier:

%Vor%

Die Listen und Nats der Hilfstypen sind unten definiert.

%Vor%     
aleator 29.12.2011, 10:13
quelle

1 Antwort

5

Nach den Andeutungen von Pigworkers habe ich es geschafft, den folgenden Code zu verarbeiten. Ich fügte ein Flag hinzu, dass die Warteschlange auf die Einschränkung zurückgesetzt werden muss, um den Aufruf an die richtige Version von enqueue zu senden.

Das Ergebnis ist ein bisschen ausführlich und ich suche immer noch nach besseren Antworten oder Verbesserungen. (Ich bin nicht einmal wirklich sicher, ob ich es geschafft habe, alle invarianten Bruchfälle mit den Einschränkungen zu überdecken.)

%Vor%     
aleator 30.12.2011 08:14
quelle

Tags und Links