假设有一个用于解析事物的方便库。它导出函数parseThing
以及一些类型和帮助程序:
module Text.Thing.Parser
( Thing ()
, parseThing
, ParseError
-- ...
) where
-- ...
data Thing = {- implementation -}
parseThing :: String -> Either ParseError Thing
parseThing = {- implementation -}
我决定编写一个包装器库,它可以在编译时解析东西。
{-# LANGUAGE TemplateHaskell #-}
module Text.Thing.Parser.TH where
import Text.Thing.Parser
import Language.Haskell.TH
import Language.Haskell.TH.Quote
thingExpr :: String -> Q Exp
thingExpr src = do
case parseThing src of
Left err -> fail $ show err
Right thing -> [| thing |]
thing :: QuasiQuoter
thing = QuasiQuoter { quoteExp = thingExpr
, quoteDec = undefined
, quotePat = undefined
, quoteType = undefined
}
编译因No instance (Lift Thing)
错误而失败,但我无法添加实例声明,因为Thing
是一个我无法访问的抽象数据类型:它在别处定义,不导出构造函数。因为我是模板Haskell的新手,所以除了解除局部变量(如果有的话)之外,我无法提出解决方案。
那么如何定义thingExpr
?感谢。