Haskell的最小完整定义注释

时间:2013-07-17 01:29:48

标签: haskell annotations ghc

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

开发人员是否有办法注释类以指示最小的完整定义?如果GHC可以对不符合此定义的实例发出警告,同时允许一组完整的默认实现,那将非常有用。如果没有,这里接受的做法是什么?开发人员是否应该保留(a?)最小的方法集而没有默认值,以便抛出相应的警告,或者我们是否依赖用户进行RTFM?

2 个答案:

答案 0 :(得分:9)

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

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

看起来它被设置为集成在GHC 7.8.1中。

<强>更新

这是GHC 7.8中的minimal pragma

答案 1 :(得分:3)

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

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

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