【问题标题】:Can't find inerface-file declaration for variable找不到变量的接口文件声明
【发布时间】:2016-11-03 18:01:14
【问题描述】:

我正在尝试将一些代码的执行转移到 GHC 8 的编译时间和 template-haskel-2.11。代码如下所示:

myThHelper :: FilePath -> Q Exp
myThHelper path =
  runIO (compileThatFile path) >>= liftData

这是该代码的简化版本,但它希望能传达我的意思 努力去做。

注意 liftData 功能,它是template-haskell-2.11 中的新功能,它承诺“提升”到 表达Data 的任何实例。非常酷,它可以编译。

但是,当我这样使用它时:

main :: IO ()
main = do
  let compiled = $(myThHelper "/path/to/my/file/foo.txt")
  …

我从编译器收到以下错误消息:

• Can't find interface-file declaration for variable Data.Text.Internal.pack
    Probable cause: bug in .hi-boot file, or inconsistent .hi file
    Use -ddump-if-trace to get an idea of which file caused the error
• In the first argument of ‘PName’, namely
    ‘Data.Text.Internal.pack ((:) 'f' ((:) 'o' ((:) 'o' [])))’
  In the first argument of ‘Template’, namely
    ‘PName (Data.Text.Internal.pack ((:) 'f' ((:) 'o' ((:) 'o' []))))’
  In the expression:

等等。知道发生了什么以及如何解决吗?


我通过实验证实,只有当要提升的数据类型包含 Text 时,问题才会出现。我要打开一个问题。


And here it is.

【问题讨论】:

    标签: haskell template-haskell


    【解决方案1】:

    这似乎是因为dataToQa 期望toConstr 显示的函数(对于Text 来说是"pack")位于定义数据类型的同一模块中。所以liftDataData.Text.Internal 中寻找packpack 实际上在Data.Text 中。

    一个简单的解决方法是为Text编写你自己的提升函数:

    {-# LANGUAGE TemplateHaskell #-}
    
    import qualified Data.Text as T
    import Language.Haskell.TH.Syntax
    
    liftText :: T.Text -> Q Exp
    liftText txt = AppE (VarE 'T.pack) <$> lift (T.unpack txt)
    
    myThHelper :: FilePath -> Q Exp
    myThHelper path =
      runIO (compileThatFile path) >>= liftText
    

    如果文本在您想要使用的结构中很深,您可以使用dataToExpQ,它可以让您针对特定类型的情况覆盖提升功能:

    import Data.Data
    
    liftDataWithText :: Data a => a -> Q Exp
    liftDataWithText = dataToExpQ (\a -> liftText <$> cast a)
    

    【讨论】:

    • 我担心“简单的方法”对我不起作用,因为我的数据有 Text 不是在顶层,而是在内部。
    • @Mark 在这种情况下,您可以使用dataToExQ。我已经更新了我的答案。
    • 这很有趣。有时间我会检查一下,如果可行,我会接受你的回答。
    • 为什么转换为文本适用于任何数据?当在相同类型的新类型包装器之间发生转换时,强制转换成功。为什么会data Foo ~ Data.Text
    • @DaniilIaitskov 你在想coercecast 只会在完全符合 Text 的情况下成功(不是新类型包装器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多