我正在开发两个包,一个包含一个类,另一个包含数据类型。这个包可以单独使用,但是当一起使用时,数据类型是该类的实例是有意义的。
有没有办法定义这种关系而不让其中一个包依赖另一个?
这是一个简单的例子,假设我有一个Car
包和一个Print
包。有一种“打印”汽车的方法,但如果我对打印没兴趣,我应该能够自己使用Car
包。同样,如果我对Car
没兴趣,我应该可以单独使用打印包。
创建第三个包PrintCars
的唯一解决方案是否依赖于前两个包?
(之所以我问这是因为我正在定义一个新类,我希望为现有类型(以及我自己的类型)包含许多合理的实例,但我不想取决于一大堆大包装,也不为每个组合制作单独的包装。)
答案 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
构造函数中。