首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“派生makeData`”为“`newType`”?

如何“派生makeData`”为“`newType`”?
EN

Stack Overflow用户
提问于 2015-03-18 16:05:57
回答 1查看 70关注 0票数 2

我正在更新Pandoc (利班多)的C绑定库,我遇到了一个无法解决的问题。我相信这和模板Haskell有关。

问题如下。libpandoc的原作者做了以下是

代码语言:javascript
复制
$( derive makeData ''WriterOptions )

这显然很重要,因为整个过程中,包含WriterOptions的实体被赋予Data.Generics.Rep.toRep,这要求它从Data派生出来。

问题是WriterOptions被定义为像这样

代码语言:javascript
复制
data WriterOptions = WriterOptions
  { ...
    ...
  , writerMediaBag :: MediaBag
  } ...

因此,要使WriterOptionsData派生,MediaBag也需要从Data派生。向libpandoc添加以下行:

代码语言:javascript
复制
$( derive makeData ''MediaBag )

但是,如果出现以下错误,则无法工作:

代码语言:javascript
复制
src/LibPandoc/Instances.hs:XX:X:
    Not in scope: data constructor `MediaBag'

我已经成功地将derive makeData用于使用data关键字创建的其他类型(例如,由ReaderOptions使用)。然而,MediaBag 定义为 newtype.

我的问题是,我如何最终使MediaBag (使用newtype定义)从Data派生,以便成功地派生包含它的实例的WriterOptions

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 00:27:20

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

不幸的是,对于具有非导出数据构造函数的类型,不允许派生Data等被认为是一种特性,因为它保护类型,防止用户破坏预期的数据抽象。因此,实际上,您可能需要如评论中所建议的那样进行上游更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29126987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档