模板Haskell的documentation表示QuasiQuoter
被定义为
data QuasiQuoter = QuasiQuoter { quoteExp :: String -> Q Exp,
quotePat :: String -> Q Pat,
quoteType :: String -> Q Type,
quoteDec :: String -> Q [Dec] }
我遇到过如下所示的silly
等示例。如果它们似乎没有填写quotePat
,quoteType
和quoteDec
字段,它们如何工作?
silly :: QuasiQuoter
silly = QuasiQuoter { quoteExp = \_ -> [| "yeah!!!" |] }
答案 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." ....