2016-03-18 17 views
0

私はHaskellの式を取って接頭辞表記を使って書き直すプログラムを実装したいと思います。接頭辞表記のHaskell式を書き直してください

私は、GHC自体が役立つ情報(解析後に追加されたかっこのようなもの)をダンプすることを望んでいましたが、残念ながらこれはそうではありません。

$ 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.()} 

このタスクにはどのような既存のAPIが最適でしょうか?

答えて

2

このタスクにはどのような既存のAPIが最適でしょうか?

テンプレートHaskellとパッケージth-desugarをdesugar Template Haskellに送信します。考え方は簡単です:式を準引用符で囲み、テンプレートhaskellとしてdesugarし、それを再びhaskellコードにレンダリングします。

それは少し厄介かもしれので、私はここにanothe答えのためのコードを再利用しています:ソースコードに行っていたものをテンプレートハスケル示す*.dump-splicesファイルをダンプします

{-# 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 

-ddump-splices GHCで:

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")) 
関連する問題