6

我正在用 Haskell 写一个蛇游戏。这些是我拥有的一些东西:

  • 一种Coord数据类型
  • 一种Line数据类型
  • 一种Rect数据类型
  • 一个Polygon类型类,它允许我将 aRect作为一系列行 ( [Line])。
  • 一个Impassable类型类,它允许我将 aLine作为一系列 Coords ( [Coord]),以便我可以检测其他Impassables 之间的冲突。
  • Draw我想在屏幕上绘制的任何东西的类型类(HSCurses)。
  • 最后我使用了 QuickCheck,所以我想Arbitrary为很多这些东西声明实例。

目前我在单独的模块中有很多这些,所以我有很多小模块。我注意到我必须为彼此导入很多,所以我有点想知道重点是什么。

我对Arbitrary实例特别困惑。使用-Wall时,当我将这些实例放在一个测试文件中时,我会收到有关孤立实例的警告,我的理解是,我可以通过将这些实例放在与定义数据类型的位置相同的模块中来避免该警告,但是我需要import Test.QuickCheck对于所有那些看起来很愚蠢的模块,因为只有在构建测试可执行文件时才需要 QuickCheck。

任何有关 QuickCheck 特定问题的建议以及有关如何/在何处将程序划分为模块的更一般问题的指导都将不胜感激。

4

4 回答 4

4

你可以吃蛋糕也可以吃。您可以重新导出模块。

module Geometry 
    ( module Coord, module Line, module Rect, module Polygon, module Impassable )
where

当我有一个完整的抽象时,我通常会使用一个模块——即当数据类型的含义与其实现不同时。对您的代码知之甚少,我可能会组合在一起,也许会创建一个Polygon数据类型来表示它们返回的内容。但是,和似乎是很好的抽象,它们可能应该拥有自己的模块。ImpassableCollisionCoordLineRect

于 2010-10-23T00:52:20.697 回答
2

出于测试目的,我对Arbitrary实例使用单独的模块。虽然我通常避免孤立实例,但这些模块仅在构建测试可执行文件时构建,所以我不介意孤立实例或它不-Wall干净。您还可以使用-fno-warn-orphans仅禁用此警告消息。

于 2010-10-23T01:14:30.723 回答
1

我通常更强调由它公开的函数定义的模块接口,而不是它公开的数据类型。您的某些类型是否共享一组通用功能?然后我会把它们放在同一个模块中。

但是我的实践可能不是最好的,因为我通常编写小程序。我建议查看一些来自Hackage的代码,以了解包维护者在做什么。

如果有办法按社区评分或下载次数对软件包进行排序,那将是一个不错的起点。(我以为有,但现在我寻找它,我找不到它。)如果失败,请查看您已经使用的软件包。

于 2010-10-23T00:44:55.173 回答
0

QuickCheck 的一种解决方案是在测试时使用 C 预处理器选择性地启用任意实例。您将 Arbitrary 实例直接放入主模块中,但用预处理器宏包装它们,然后将“测试”标志放入 Cabal 文件中。

于 2013-08-23T21:23:39.710 回答