我正在更新Pandoc (利班多)的C绑定库,我遇到了一个无法解决的问题。我相信这和模板Haskell有关。
问题如下。libpandoc的原作者做了以下是
$( derive makeData ''WriterOptions )这显然很重要,因为整个过程中,包含WriterOptions的实体被赋予Data.Generics.Rep.toRep,这要求它从Data派生出来。
问题是WriterOptions被定义为像这样
data WriterOptions = WriterOptions
{ ...
...
, writerMediaBag :: MediaBag
} ...因此,要使WriterOptions从Data派生,MediaBag也需要从Data派生。向libpandoc添加以下行:
$( derive makeData ''MediaBag )但是,如果出现以下错误,则无法工作:
src/LibPandoc/Instances.hs:XX:X:
Not in scope: data constructor `MediaBag'我已经成功地将derive makeData用于使用data关键字创建的其他类型(例如,由ReaderOptions使用)。然而,MediaBag 定义为 newtype.
我的问题是,我如何最终使MediaBag (使用newtype定义)从Data派生,以便成功地派生包含它的实例的WriterOptions?
发布于 2015-03-19 00:27:20
我认为问题不在于它是一个newtype,而是Text.Pandoc.MediaBag只导出类型构造函数MediaBag,而不是数据构造函数。(注意错误消息抱怨的是后者。)
不幸的是,对于具有非导出数据构造函数的类型,不允许派生Data等被认为是一种特性,因为它保护类型,防止用户破坏预期的数据抽象。因此,实际上,您可能需要如评论中所建议的那样进行上游更改。
https://stackoverflow.com/questions/29126987
复制相似问题