【发布时间】:2020-07-05 19:17:28
【问题描述】:
我有以下数据类型:
data My a = Constr a Int String Float VariousComplexTypes ...
我希望能够在其上调用 over template (+1) 以更改此数据类型中的所有 Int 字段并在以后更改。但是,我不能请求 a 成为 Data 的实例(它的构造函数是隐藏的)。同时,我对用over template 调用更改它并不感兴趣,所以我尝试手动编写instance Data (My a),使其忽略a 类型的第一个字段,但失败了。以下代码
instance Data (My a) where
gunfold k z _ = k (k (k (z Constr)))
toConstr _ = con
dataTypeOf _ = ty
con = mkConstr ty "Constr" [] Prefix
ty = mkDataType "Mod.My" [con]
产生以下错误:
• No instance for (Data a) arising from a use of ‘k’
• In the first argument of ‘k’, namely ‘(k (z Constr))’
In the first argument of ‘k’, namely ‘(k (k (z Constr)))’
In the expression: k (k (k (z Constr)))
|
61 | gunfold k z _ = k (k (k (z Constr)))
这可能吗?除了手工编写所有样板文件外,我还有什么其他选择?
【问题讨论】:
-
向我们展示您失败的实例,以及您从中得到的确切错误。
-
@DanielWagner 完成。不过,不确定以前版本的问题有什么不清楚的地方。
-
@arrowd,该错误大大提高了问题的可发现性(当某些事情无法正常工作时,谷歌搜索错误消息!)。这也像一个校验和,我们对正在发生的事情的假设是正确的。我们也有足够多的人基本上要求我们的志愿者为他们做功课,因此包括所有相关细节以使其成为高质量的问题是诚意的标志。
-
@luqui 成为会员 9 年,我知道所有这些事情并同意它们。但是,这个特定的
No instance for (Data a)错误可能由于各种原因而发生,所以正是为了便于发现,我在问题标题中写了instance、Data.Data、ignore和field。我仍然相信我的问题没问题,不值得投反对票(在编辑后甚至没有被撤回)。
标签: haskell