2017-02-20 3 views
3

Ich versuche mit GHC-Core-Datentypen zu arbeiten. Ich bin in der Lage, meine Haskell-Quelle zu Kern-Darstellung mit dem Typ Bind CoreBndr zu kompilieren. Wie wir wissen, gibt es keine Standard Show Instanz für diesen Datentyp. Es gibt eine Möglichkeit, diese Darstellung hübsch zu drucken, aber es ist viel zu viel Rauschen damit verbunden. Ich möchte GHC-Kern wie jeden anderen algebraischen Datentyp behandeln und Funktionen damit schreiben. Es wäre viel einfacher, wenn wir eine Show Instanz des GHC-Kerns hätten. Hat schon jemand eine Show-Instanz geschrieben, die ich wiederverwenden kann?`Show` Instanz für GHC-Core

Abgesehen davon, wie schreibt und verifiziert die Gemeinschaft Programme, die sich mit GHC-Kern befassen?

+0

Welche Art von Lärm reden Sie? –

+0

Die Ausgabe von 'ghc -c file.hs -ddump-simpl 'gibt eine Kerndarstellung der Programm-Syntax, die mit expliziten Typen, Wörterbuchargumenten, Vorkommensprüfungen usw. gedruckt wird. In einem Programmkontext ist die Kerndarstellung jedoch nur ein Wert eines bestimmten Datentyps . – ankitrokdeonsns

+0

Der Hauptzweck von Kern ist nicht, hübsch gedruckt zu werden; es ist eine interne Sprache auf niedriger Ebene, deren Design weitgehend dem Compiler und nicht dem menschlichen Programmierer zu Gute kommt. Allerdings "Ich möchte GHC-Kern wie jeden anderen algebraischen Datentyp behandeln und Funktionen damit schreiben" - dies ist bereits genau der Fall. Core ist buchstäblich nur eine Haskell ADT - was führt Sie dazu, etwas anderes zu glauben? Beachten Sie, dass es im GHC api bereits einen [hübschen Drucker für Core] (https://www.stackage.org/haddock/lts-8.2/ghc-8.0.2/PprCore.html) gibt. – user2407038

Antwort

1

in GHC Mülltonne Tauchen gegangen und dachte die gleiche Frage, ich kann sicher sagen, dass eine naive Implementierung von Show in GHC ist NICHT was Sie wollen. Der Grund dafür ist, dass intern GHC Rekursion unter vielen seiner Datentypen hat. Zum Beispiel zwischen TyCon, AlgTyConRhs und DataCon haben wir:

TyCon hat AlgTyCon, die AlgTyConRhs enthält.

AlgTyConRhs enthält data_cons :: [DataCon] als eines seiner Datensatzfelder.

DataCon enthält dcRepTyCon :: TyCon als eines seiner Felder.

Und damit schließen wir den Kreis. Aufgrund der Funktionsweise von Show erzeugt eine Rekursion wie diese eine unendliche Ausgabe, wenn Sie versuchen, sie zu drucken.

Um eine "nette" benutzerdefinierte Darstellung mit Datenkonstruktoren und allem, was angezeigt wird, zu erhalten, müssten Sie es selbst schreiben. Das ist eigentlich etwas herausfordernd, da Sie Fälle von Rekursionen, wie sie von Standard-Druckern gelöst wurden, in Betracht ziehen und debuggen müssen.

Es ist mühsam, wurden viele Tabs geöffnet, aber es ist eine gute Lernerfahrung :)

Verwandte Themen