问题 Haskell的最小完整定义注释


我定义了一个 NumericPrelude  Ring 我自己的数据类型的实例,但未能定义 one 要么 fromInteger。当我编译程序时,我没有得到任何警告,因为 Ring class有默认值 相互递归 实现 one 和 fromInteger。结果:堆栈溢出很难找到。 (的确,当使用-XRebindableSyntax时, fromInteger 数字常量不需要是明确的,所以很难弄明白 fromInteger 是堆栈溢出的罪魁祸首。)

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


8131
2017-07-17 01:29


起源



答案:


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

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

看起来它将被整合到GHC 7.8.1中。

UPDATE

这是 最小的pragma 在GHC 7.8。


9
2017-07-17 02:05





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

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

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


3
2017-07-17 08:28