Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用前缀表示法重写Haskell表达式_Haskell - Fatal编程技术网

用前缀表示法重写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

我想实现一个程序,它可以接受任何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.()}
$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"))