首页 文章

额外模块中不常见的类型类的实例声明

提问于
浏览
1

将非常规类型类的实例声明放在额外的模块中是不是很好的风格?

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

module Data.Tree where

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

假设我想使用QuickCheck的 Arbitrary 类型类来生成 Tree 类型的随机值(并且不仅可以在测试中使用它们) .

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

module Data.Tree where

import QuickCheck.Arbitrary

data Tree a = ...

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

或者将实例声明外包给另一个模块以避免依赖_30433120_ Data.Tree

module Data.Tree.Arbitrary where

import Data.Tree
import QuickCheck.Arbitrary

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

或完全不同的东西?

1 回答

  • 3

    避免孤儿实例通常是一个好主意:那些总是有利于惊喜,而且很难找到 .

    所以,是的,将实例放在定义了 Tree 的模块中 . 这会使模块稍微爆炸,但如果你有一个较大的模块或两个较小的模块,它应该不会很重要 .

    当您可以完全避免包依赖时,这可能会使孤立实例变得有 Value ,因为安装包显然比从已安装的包导入模块要大得多 .

相关问题