2016-03-18 2 views
0

Ich möchte ein Programm implementieren, das jeden Haskell-Ausdruck verwendet und ihn mit Präfix-Notation umschreibt.Haskell-Ausdruck in Präfix-Notation umschreiben

Ich hatte gehofft, dass GHC selbst einige hilfreiche Informationen (wie hinzugefügte Klammern nach dem Parsen) dump, aber das scheint leider nicht der Fall zu sein.

$ ghc Example.hs -fforce-recomp -ddump-tc 
[1 of 1] Compiling Example   (Example.hs, Example.o) 
TYPE SIGNATURES 
    f :: Maybe() 
TYPE CONSTRUCTORS 
COERCION AXIOMS 
Dependent modules: [] 
Dependent packages: [base-4.8.1.0, ghc-prim-0.4.0.0, 
        integer-gmp-1.0.0.0] 

==================== Typechecker ==================== 
AbsBinds [] [] 
    {Exports: [f <= f_alA 
       <>] 
    Exported types: f :: Maybe() 
        [LclId, Str=DmdType] 
    Binds: f_alA = ($) const (GHC.Base.Just) "Foo" GHC.Tuple.()} 

Welche existierende API wäre für diese Aufgabe am besten geeignet?

Antwort

2

Welche vorhandene API wäre für diese Aufgabe am besten geeignet?

Mit Vorlage Haskell und einem Paket th-desugar zu entschuldigen Vorlage Haskell. Die Idee ist einfach: Umbrechen Sie den Ausdruck in Quasi-Anführungszeichen, entziffern Sie ihn als Vorlagen-Haskell und rendern Sie ihn dann erneut in den Haskell-Code.

ich den Code für anothe Antwort Wiederverwendung hier so ist es ein wenig chaotisch sein kann:

{-# LANGUAGE DeriveGeneric #-} 
{-# LANGUAGE QuasiQuotes  #-} 
{-# LANGUAGE TemplateHaskell #-} 

import   Control.Monad 
import   Generics.Deriving.Monoid 
import   GHC.Generics 
import   Language.Haskell.TH.Desugar 

data T = MkT {str :: String, str' :: String} 
    deriving (Generic, Show) 

main = $([| print $ MkT "a" "b" `mappend` MkT "c" "d" |] >>= dsExp >>= return . expToTH) 

instance Monoid T where 
    mempty = memptydefault 
    mappend = mappenddefault 

von -ddump-splices ghc wird Dump eine *.dump-splices Datei zeigt, welche Vorlage Haskell auf den Quellcode getan hatte:

app\Main.hs:12:10-87: Splicing expression 
    [| print $ MkT "a" "b" `mappend` MkT "c" "d" |] >>= dsExp 
    >>= return . expToTH 
    ======> 
    ($) print (mappend (MkT "a" "b") (MkT "c" "d"))