如何`派生makeData`一个`newType`?

时间:2015-03-18 16:05:57

标签: haskell

我正在为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来自DataMediaBag也需要从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

1 个答案:

答案 0 :(得分:1)

我认为问题不在于newtype,而是Text.Pandoc.MediaBag只导出类型构造函数MediaBag,而不是Data 数据构造函数。 (注意错误信息抱怨的是后者。)

不幸的是,不允许为具有非导出数据构造函数的类型派生{{1}}等被认为是特性,因为它可以防止用户违反预期的数据抽象。所以你的确可能需要根据评论中的建议进行上游变更。