包实例依赖项

时间:2015-07-16 04:50:19

标签: haskell

我正在开发两个包,一个包含一个类,另一个包含数据类型。这个包可以单独使用,但是当一起使用时,数据类型是该类的实例是有意义的。

有没有办法定义这种关系而不让其中一个包依赖另一个?

这是一个简单的例子,假设我有一个Car包和一个Print包。有一种“打印”汽车的方法,但如果我对打印没兴趣,我应该能够自己使用Car包。同样,如果我对Car没兴趣,我应该可以单独使用打印包。

创建第三个包PrintCars的唯一解决方案是否依赖于前两个包?

(之所以我问这是因为我正在定义一个新类,我希望为现有类型(以及我自己的类型)包含许多合理的实例,但我不想取决于一大堆大包装,也不为每个组合制作单独的包装。)

1 个答案:

答案 0 :(得分:1)

实例必须依赖于Car类型和Printable类,除非可以从Printable是实例的其他类派生Car。 (如果将Printable定义为class Show a => Printable a,则会有一个非常简单但无用的示例,并且有一个实例Show Car。)

您可以在第三个包中定义实例Print Car,但这可能是orphan instance

如我所链接的页面所述,孤儿治疗的解决方法是创建newtype,例如:

newtype PrintableCar = PrintableCar Car

instance Print PrintableCar where
    print (PrintableCar car) = ...

现在,要打印汽车,必须将其包装在PrintableCar构造函数中。