提升抽象数据类型

时间:2014-07-16 03:52:10

标签: haskell template-haskell

假设有一个用于解析事物的方便库。它导出函数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?感谢。

0 个答案:

没有答案