QuickCheck实例属于cabal包中的哪个位置?

acf*_*zer 18 haskell quickcheck cabal

我有一个cabal包,可以导出一个NBT可能对其他开发人员有用的类型.我经历了Arbitrary为我的类型定义一个实例的麻烦,如果没有将它提供给其他开发人员来测试他们整合我的工作的代码,那将是一种耻辱.

但是,我想避免我的实例可能妨碍的情况.也许其他开发人员对实例应该是什么有不同的想法Arbitrary.也许我的软件包依赖于特定版本的QuickCheck可能会干扰或不需要客户端项目的依赖项.

我的想法没有特别的顺序,是:

  • Arbitrary实例保留在类型定义旁边,让客户端处理实例的阴影或覆盖QuickCheck版本号.
  • 使Arbitrary实例在同一封装内的单独的模块孤儿例如,假设Data.NBT.Arbitrary.QuickCheck对整个包的依赖性仍然存在.
  • Arbitrary在完全独立的包中提供实例,以便可以将其列为客户端项目的单独测试依赖项.
  • 有条件地Arbitrary在主包中包含实例和QuickCheck依赖项,但仅在-ftest设置了类似标志的情况下.

我已经看到所有这些在其他库中使用的组合,但没有找到任何最佳工作的共识.我想在上传到Hackage之前尝试正确使用它.

iva*_*anm 2

问题归结为:使用您的库的人想要使用您的NBT类型运行 QuickCheck 测试的可能性有多大?

如果可能,并且任意实例是详细的(因此不太可能针对不同的人进行更改),那么最好将其与您的包一起提供,特别是如果您要确保不断更新包(至于是否使用标志,这取决于个人喜好)。然而,如果实例相对简单(因此人们更有可能想要自定义它),那么在文档中提供示例实例可能是一个想法。

如果类型本质上主要是内部的,并且不太可能被想要运行测试的其他人使用,那么使用标志有条件地引入 QuickCheck 可能是避免不必要的依赖关系的最佳方法(即测试套件就在那里)可以测试该包)。

一般来说,我不喜欢仅使用 QuickCheck 包,尽管它在某些情况下可能很有用。

  • +1——在这种特殊情况下,“文档中的示例实例”似乎是合适的。或者,如果您将自己的测试套件与包捆绑在一起(使用新的 cabal 测试功能),那么文档可以只指向包本身源中的实例(仅编译用于测试,而不是用于安装) (2认同)