用前缀表示法重写Haskell表达式
我想实现一个程序,它可以接受任何Haskell表达式,并使用前缀符号重写它 我希望用前缀表示法重写Haskell表达式,haskell,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 AXI
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.()}
$ghc Example.hs-fforce recomp-ddump tc
[1/1]编译示例(Example.hs,Example.o)
类型签名
f::可能()
类型构造函数
强制公理
依赖模块:[]
相关软件包:[base-4.8.1.0,ghc-prim-0.4.0.0,
整数-gmp-1.0.0.0]
=====================================字体检查器====================
AbsBinds[][]
{出口:[f]
什么现有API最适合此任务
使用模板Haskell和一个包th desugar
到desugar Template Haskell。其思想很简单:将表达式用准引号括起来,将其作为模板Haskell进行desugar,然后再次将其呈现给Haskell代码
我在这里重复使用代码来获得答案,因此可能有点混乱:
{-# 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拼接
ghc将转储一个*。转储拼接
文件,显示模板haskell对源代码所做的操作:
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"))
什么现有API最适合此任务
使用模板Haskell和一个包th desugar
到desugar Template Haskell。其思想很简单:将表达式用准引号括起来,将其作为模板Haskell进行desugar,然后再次将其呈现给Haskell代码
我在这里重复使用代码来获得答案,因此可能有点混乱:
{-# 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拼接
ghc将转储一个*。转储拼接
文件,显示模板haskell对源代码所做的操作:
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"))