我应该在Haskell中制作模块有多小?

时间:2010-10-23 00:32:48

标签: haskell module modularity

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

  • Coord数据类型
  • Line数据类型
  • Rect数据类型
  • Polygon类型类,可让我将Rect作为一系列行([Line])。
  • Impassable类型类,允许我将Line作为一系列Coords([Coord]),以便我可以检测到其他Impassable之间的冲突。< / LI>
  • 我想要绘制到屏幕上的任何内容的Draw类型类(HSCurses)。
  • 最后我使用的是QuickCheck,所以我想为很多这些事情声明Arbitrary个实例。

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

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

有关QuickCheck特定问题的任何建议都将受到赞赏,因为有关如何/将程序划分为模块的更一般性问题的指导意见。

4 个答案:

答案 0 :(得分:4)

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

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

每当我有一个完整的抽象时,我通常会使用一个模块 - 即当数据类型的含义与其实现不同时。对代码知之甚少,我可能会将PolygonImpassable组合在一起,或许可以使用Collision数据类型来表示它们返回的内容。但CoordLineRect似乎是很好的抽象,他们可能应该拥有自己的模块。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

但是我的练习可能不是最好的,因为我经常写小程序。我建议查看Hackage中的一些代码,看看包维护者做了什么。

如果有一种方法可以按社区评级或下载次数对软件包进行排序,那么这将是一个很好的起点。 (我以为有,但现在我找不到了,我找不到它。)如果不这样做,看看你已经使用过的包裹。

答案 3 :(得分:0)

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