2013-07-17 29 views
9

我为我自己的数据类型定义了一个NumericPreludeRing实例,但未能定义onefromInteger。当我编译程序时,我没有收到任何警告,因为Ring类具有相互递归的实现onefromInteger。结果是:很难找到堆栈溢出。 (事实上​​,使用-XRebindableSyntax的fromInteger的数字常数时不必明确的,所以这是非常难以弄清楚fromInteger是堆栈溢出的元凶。)Haskell的最小完整定义注释

有没有办法为开发商注释类表示一个最小的完整定义?如果GHC可以对不符合该定义的实例发出警告,同时允许一组完整的默认实现,那将会非常有用。如果不是,这里公认的做法是什么?开发者是否应该在没有默认值的情况下离开(a?)最少的一组方法,以便引发适当的警告,或者我们是否依赖用户使用RTFM?

回答

2

我已经看到了这两种方法基本上是:

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

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