Haskell 包实例依赖项
我正在开发两个包,一个是类,另一个是数据类型。这些包可以单独使用,但当一起使用时,将数据类型作为类的实例是有意义的 有没有一种方法可以定义这种关系而不使一个包依赖于另一个包 这里有一个简单的例子,假设我有一个Haskell 包实例依赖项,haskell,Haskell,我正在开发两个包,一个是类,另一个是数据类型。这些包可以单独使用,但当一起使用时,将数据类型作为类的实例是有意义的 有没有一种方法可以定义这种关系而不使一个包依赖于另一个包 这里有一个简单的例子,假设我有一个Car包和一个Print包。有一种方法可以“打印”汽车,但如果我对打印不感兴趣,我应该能够自己使用汽车软件包。同样,如果我对Cars不感兴趣,我应该可以自己使用打印包 是创建第三个包的唯一解决方案,PrintCars,它依赖于前两个包 (我问这个问题的原因是我正在定义一个新类,我想为现有类型
Car
包和一个Print
包。有一种方法可以“打印”汽车,但如果我对打印不感兴趣,我应该能够自己使用汽车软件包。同样,如果我对Car
s不感兴趣,我应该可以自己使用打印包
是创建第三个包的唯一解决方案,PrintCars
,它依赖于前两个包
(我问这个问题的原因是我正在定义一个新类,我想为现有类型(以及我自己的类型)包含许多合理的实例,但我不想依赖于一大堆大的包,也不想为每个组合创建单独的包).一个实例必须依赖于Car
类型和Printable
类,除非可以从Car
为实例的其他类派生Printable
。(如果Printable
被定义为class Show A=>Printable A
,并且有一个实例Show Car
,这将是一个非常简单但无用的示例)
您可以在第三个包中定义一个实例printcar
,但这将是一个
如我链接的页面所述,孤立性的解决方法是创建一个newtype
,例如:
newtype PrintableCar = PrintableCar Car
instance Print PrintableCar where
print (PrintableCar car) = ...
现在,要打印汽车,您必须将其包装在PrintableCar
构造函数中。这是Haskell软件包管理中经常遇到的未解决问题,我相信每个人都会喜欢一种更好的方法。