Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 QuasiQuoter构造函数的记录语法_Haskell_Template Haskell - Fatal编程技术网

Haskell QuasiQuoter构造函数的记录语法

Haskell QuasiQuoter构造函数的记录语法,haskell,template-haskell,Haskell,Template Haskell,Haskell的模板说,quasikoter定义为 data QuasiQuoter = QuasiQuoter { quoteExp :: String -> Q Exp, quotePat :: String -> Q Pat, quoteType :: String -> Q Type,

Haskell的模板说,
quasikoter
定义为

data QuasiQuoter = QuasiQuoter { quoteExp  :: String -> Q Exp,
                                 quotePat  :: String -> Q Pat,
                                 quoteType :: String -> Q Type,
                                 quoteDec  :: String -> Q [Dec] }
我遇到过如下所示的示例
dully
。如果它们似乎没有填写
quotePat
quoteType
quoteDec
字段,它们是如何工作的

silly :: QuasiQuoter
silly = QuasiQuoter { quoteExp = \_ -> [| "yeah!!!" |] }

答案与TH无关:如果不初始化记录构造函数的字段,尝试访问该字段将导致错误:

>data D = D {a :: Int, b :: Char} deriving Show
>D {a = 0}
D {a = 0, b = *** Exception: <interactive>:26:1-9: Missing field in record construction :Interactive.b

哦,那么记录语法允许“不完整”的构造,与代数数据类型的更常见语法允许的典型数据构造函数形成对比?在文档中详细讨论了这一点吗?好吧,您可以通过在普通构造函数中放入undefined来实现相同的语义,例如just undefined。实际上,我找不到专门针对传统记录语法的文档。也许它根本不存在;记录语法在Haskell中更像是事后才想到的。无论如何,它只是句法上的糖分;上面提到的数据类型将定义两个函数
a::D->Int
b::D->Char
,我相信您已经知道了。记录更新只是应用程序的功能。而
D{a=0}
正好相当于
d0(错误“记录构造中缺少字段”)
quote = QuasiQuoter { 
   quoteExp = something, 
   quotePat = error "quote: Invalid application in pattern context." ....