12

我为自己的数据类型定义了一个NumericPrelude Ring实例,但未能定义oneor fromInteger。当我编译程序时,我没有收到任何警告,因为Ring该类具有默认的相互递归实现onefromInteger。结果:一个很难找到的堆栈溢出。(确实,当使用 -XRebindableSyntax 时,fromIntegeron 数字常量不需要显式,因此很难找出fromInteger堆栈溢出的罪魁祸首。)

开发人员有没有办法注释类以指示最小的完整定义?如果 GHC 可以对不符合此定义的实例发出警告,同时允许一整套默认实现,那将非常有帮助。如果不是,这里公认的做法是什么?开发人员应该保留(a?)没有默认值的最小方法集,以便引发适当的警告,还是我们依赖用户使用 RTFM?

4

2 回答 2

11

看起来这可能正在进行中。

http://ghc.haskell.org/trac/ghc/ticket/7633 (及相关: http: //ghc.haskell.org/trac/ghc/ticket/6028

看起来它将被集成到 GHC 7.8.1 中。

更新

这是GHC 7.8 中的最小编译指示。

于 2013-07-17T02:05:42.650 回答
3

我见过的两种方法基本上是:

  1. 提供默认值。在文档中指定最小完整定义(通常您有选项;使用相互递归的默认值,您只需要实现足够的方法来中断递归,但您可以选择任何您喜欢的方法)。期望实例编写者阅读文档。

  2. 不要指定默认值,而是提供名称如defaultImplementationOfFoo. 这基本上迫使实例编写者明确要求默认值,而不要求它们实际提供默认值的实现。但是他们仍然必须阅读文档才能知道这些功能的存在。

于 2013-07-17T08:28:15.977 回答