记录QuasiQuoter构造函数的语法

时间:2013-12-11 03:01:20

标签: haskell template-haskell

模板Haskell的documentation表示QuasiQuoter被定义为

data QuasiQuoter = QuasiQuoter { quoteExp  :: String -> Q Exp,
                                 quotePat  :: String -> Q Pat,
                                 quoteType :: String -> Q Type,
                                 quoteDec  :: String -> Q [Dec] }

我遇到过如下所示的silly等示例。如果它们似乎没有填写quotePatquoteTypequoteDec字段,它们如何工作?

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

1 个答案:

答案 0 :(得分:5)

答案与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

在这种情况下,这是期望的行为,因为某些引用仅在某个上下文中有意义,并且如果它们被不正确地使用则应该抛出错误。虽然,您很可能希望为您的引文提供更具描述性的错误消息,例如:

quote = QuasiQuoter { 
   quoteExp = something, 
   quotePat = error "quote: Invalid application in pattern context." ....