我正在为Pandoc(libpandoc)更新C绑定库,并且我遇到了一个超出我的问题。我相信这与模板Haskell有关。
问题如下。 libpandoc的原作者已完成the following:
$( derive makeData ''WriterOptions )
这显然很重要,因为在这一行中,包含WriterOptions
的实体会被赋予Data.Generics.Rep.toRep
,这要求它来自Data
。
问题在于WriterOptions
已定义like this:
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
用于使用ReaderOptions
关键字创建的其他类型(例如data
使用的)。但是,MediaBag
is defined with newtype
。
我的问题是,我如何最终使用MediaBag
定义的newtype
派生自Data
,以便我可以成功派生包含其实例的WriterOptions
?
答案 0 :(得分:1)
我认为问题不在于newtype
,而是Text.Pandoc.MediaBag
只导出类型构造函数MediaBag
,而不是Data
数据构造函数。 (注意错误信息抱怨的是后者。)
不幸的是,不允许为具有非导出数据构造函数的类型派生{{1}}等被认为是特性,因为它可以防止用户违反预期的数据抽象。所以你的确可能需要根据评论中的建议进行上游变更。