我为自己的数据类型定义了NumericPrelude Ring
个实例,但未能定义one
或fromInteger
。当我编译程序时,我没有收到任何警告,因为Ring
类具有one
和fromInteger
的默认相互递归实现。结果:堆栈溢出很难找到。 (实际上,当使用-XRebindableSyntax时,数字常量上的fromInteger
不需要是显式的,因此很难弄清fromInteger
是堆栈溢出的罪魁祸首。)
开发人员是否有办法注释类以指示最小的完整定义?如果GHC可以对不符合此定义的实例发出警告,同时允许一组完整的默认实现,那将非常有用。如果没有,这里接受的做法是什么?开发人员是否应该保留(a?)最小的方法集而没有默认值,以便抛出相应的警告,或者我们是否依赖用户进行RTFM?
答案 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)
我见过的两种方法基本上都是:
提供默认值。在文档中指定最小完整定义(通常你有选项;使用相互递归的默认值,你只需要实现足够的方法来打破递归,但你可以选择你喜欢的任何方法)。期望实例编写者阅读文档。
不指定默认值,但提供名称为defaultImplementationOfFoo
的函数。这基本上迫使实例编写器明确要求默认值,而不要求它们实际提供默认的实现。但他们仍然需要阅读文档才能知道这些功能存在。