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

时间:2011-08-12 16:42:49

标签: haskell cabal quickcheck

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

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

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

  • Arbitrary实例留在类型定义的旁边,让客户端处理阴影实例或覆盖QuickCheck版本号。
  • 使Arbitrary实例成为同一个包中单独模块中的孤立实例,例如Data.NBT.Arbitrary。 QuickCheck对整个包的依赖性仍然存在。
  • 在一个完全独立的包中提供Arbitrary实例,以便它可以作为客户项目的单独测试依赖项列出。
  • 有条件地在主程序包中包含Arbitrary实例和QuickCheck依赖项,但仅当设置了-ftest之类的标记时才会这样。

我已经看到其他图书馆中使用的所有这些组合,但没有找到任何最佳合作的共识。我想尝试在上传到Hackage之前把它弄好。

2 个答案:

答案 0 :(得分:3)

基于没有太多具体经验,但对稳健性的一般要求,包依赖的指导原则应该是

  

各自根据自己的能力;每个人都根据自己的需要。

将软件包的依赖关系保持在其基本功能所需的最小值是件好事。这向我提出了选项3或选项4。当然,把包装剁得那么痛苦是很痛苦的。如果选项能够表达所涉及的条件,那么选项4听起来像一种明智的方法,基于有效地使用语言来表达你的意思。

如果就我们需要哪一个开关来获取测试工具包以及基本功能达成共识,那将是非常好的。

很明显,这里还有改进的空间。令人惊奇的是,Cabal和它一样工作,但它可能允许更复杂的“包”概念,也许是在SML模块系统的方式之后。将依赖转换为函数类型,我们基本上可以编写

simplePackage :: (Dependency1, .., Dependencyn) -> Deliverable

但可以想象更精细的产品和功能组合,例如

fancyPackage :: BasicDependency -> (BasicDeliverable, HelpfulExtras -> Gravy)

在此之前,选择最准确反映实际交易的选项。并告诉我们,我们可以建立这种共识。

答案 1 :(得分:2)

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

如果可能,并且任意实例是详细的(因此不太可能针对不同的人进行更改),最好将其与您的包一起发货,特别是如果您要确保不断更新包裹(如果是否使用旗帜,可归结为个人偏好)。但是,如果实例相对简单(因此人们更希望自定义它),那么在文档中提供示例实例可能是一个想法。

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

我不喜欢一般只使用QuickCheck软件包,但在某些情况下可能会有用。