我正在Haskell写一个蛇游戏。这些是我的一些东西:
Coord
数据类型Line
数据类型Rect
数据类型Polygon
类型类,可让我将Rect
作为一系列行([Line]
)。Impassable
类型类,允许我将Line
作为一系列Coords([Coord]
),以便我可以检测到其他Impassable
之间的冲突。< / LI>
Draw
类型类(HSCurses)。Arbitrary
个实例。目前我在单独的模块中有很多这些,所以我有很多小模块。我注意到我必须互相导入很多,所以我有点想知道这是什么。
我对Arbitrary
个实例感到特别困惑。使用-Wall
时,当我将这些实例放在一个测试文件中时,我收到有关孤立实例的警告,我的理解是我可以通过将这些实例放在与定义数据类型的模块相同的模块中来避免该警告我需要import Test.QuickCheck
所有那些看似愚蠢的模块,因为只有在构建测试可执行文件时才需要QuickCheck。
有关QuickCheck特定问题的任何建议都将受到赞赏,因为有关如何/将程序划分为模块的更一般性问题的指导意见。
答案 0 :(得分:4)
你也可以吃蛋糕。您可以重新导出模块。
module Geometry
( module Coord, module Line, module Rect, module Polygon, module Impassable )
where
每当我有一个完整的抽象时,我通常会使用一个模块 - 即当数据类型的含义与其实现不同时。对代码知之甚少,我可能会将Polygon
和Impassable
组合在一起,或许可以使用Collision
数据类型来表示它们返回的内容。但Coord
,Line
和Rect
似乎是很好的抽象,他们可能应该拥有自己的模块。
答案 1 :(得分:2)
出于测试目的,我为Arbitrary
实例使用单独的模块。虽然我通常避免使用孤立实例,但这些模块只在构建测试可执行文件时才构建,所以我不介意孤儿或者它不是-Wall
干净的。您也可以使用-fno-warn-orphans
禁用此警告消息。
答案 2 :(得分:1)
我通常更多地强调模块接口,它由它公开的函数定义,而不是它公开的数据类型。您的某些类型是否共享一组共同的功能?然后我会把它们放在同一个模块中。
但是我的练习可能不是最好的,因为我经常写小程序。我建议查看Hackage中的一些代码,看看包维护者做了什么。
如果有一种方法可以按社区评级或下载次数对软件包进行排序,那么这将是一个很好的起点。 (我以为有,但现在我找不到了,我找不到它。)如果不这样做,看看你已经使用过的包裹。
答案 3 :(得分:0)
使用QuickCheck的一个解决方案是使用C预处理器在测试时有选择地启用任意实例。你将Arbitrary实例直接放入主模块中,但用预处理器宏包装它们,然后在你的Cabal文件中加上一个“test”标志。