我使用Haskell和功能图库来表示图。有两种方法可以直接比较图形,即通过函数equal或通过另一个函数isIsomorph进行比较。我想使用哈希图来收集图形。为此,我必须为我的图创建类Eq的实例。但是我需要两个哈希图,第一个用于按函数equal比较的图,第二个用于按函数isIsomorph组成的图。
如果我做
type Fragment = Gr Atom Bond {-- Gr is a type constructor from the Functional Graph Library}
instance Eq (Gr Atom Bond) where
g == g1 = equal g g1
instance Eq Fragment where
g == g1 = isIsomorph g g1
我有一个预期的错误
Duplicate instance declarations:
instance [overlap ok] Eq (Gr Atom Bond) -- Defined at HLab.hs:45:10
instance [overlap ok] Eq Fragment -- Defined at HLab.hs:48:10
由于类型的原因,只能进行除法包装。
我可以用另一种方式
data Fragment = Fragment {fgraph :: Gr Atom Bond}
instance Eq (Gr Atom Bond) where
g == g1 = equal g g1
instance Eq Fragment where
Fragment g == Fragment g1 = isIsomorph g g1
没错,但是我使用了“重载”类型的构造函数数据,这种方式也很不方便,我必须通过附加函数fgraph从片段中获取图形。
是否有任何“美丽”和“真实”方式将这种类型划分为代码的各个部分?
将这种类型划分为代码各部分的“美丽”和“真实”方式?是用newtype
的,而不是data
:对于所有类型的系统而言,它们是不同的(特别是,你可以定义不同类型的类实例),但它们共享相同的运行时表示,没有额外的像data
:
newtype Fragment = Fragment {fgraph :: Gr Atom Bond}
instance Eq (Gr Atom Bond) where
g == g1 = equal g g1
instance Eq Fragment where
Fragment g == Fragment g1 = isIsomorph g g1
尝试在片段上使用图函数时,仍然需要在图和片段之间进行转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句