2015-12-13 97 views
1

将非常见类型类的实例声明放在额外模块中是不错的样式吗?额外模块中罕见类型类的实例声明

作为一个例子,我有这个简单的树类型:

module Data.Tree where 

data Tree a = Leaf a 
      | Node (Tree a) (Tree a) 

假设我想用快速检查的Arbitrary类型类生成Tree类型的随机值(和能够不仅在测试中使用它们)。

什么是最好的?把它们放在同一个模块在Tree定义

module Data.Tree where 

import QuickCheck.Arbitrary 

data Tree a = ... 

instance Arbitrary a => Arbitrary (Tree a) where 
    ... 

或外包实例声明另一个模块,以避免Data.Tree

module Data.Tree.Arbitrary where 

import Data.Tree 
import QuickCheck.Arbitrary 

instance Arbitrary a => Arbitrary (Tree a) where 
    ... 

或别的东西完全依赖于QuickCheck.Arbitrary

回答

3

它通常是避免孤儿情况下是一个好主意:这些都是惊喜总是好的,而很难找到。

所以,是的,把实例,其中Tree定义的模块中。这会让模块吹起来一点,但它不应该是一个问题。如果你有一个较大的模块或两个较小的模块,那么整个封装的总构建时间应该不会太大。

当你能完全避免包的依赖,这可能使孤儿情况下是值得的,因为安装包是明显高于从安装包导入模块更大的性能问题。

+0

避免软件包的依赖关系不只是一个性能问题,它是关于避免与可能有不同的版本库的依赖其它软件包之间的冲突。 –

+0

@AlexeyRomanov:当然,但是在依赖冲突的情况下,孤立实例模块可能也无济于事。 – leftaroundabout

+0

@leftaroundabout如果该模块没有暴露 - 例如如果它只在测试套件的内部使用,这看起来可能考虑到在问题中对快速检查的明确讨论。 –