Haskell と Functional Graph Library を使用してグラフを表現します。グラフを直接、関数equalで比較する方法と、私が書いたisIsomorphという別の関数で比較する方法は 2 つあります。グラフを収集するためにハッシュマップを使用したい。そのためには、グラフ用にクラスEqのインスタンスを作成する必要があります。しかし、2 つのハッシュ マップが必要です。1 つ目は関数equalで比較したグラフ用、2 つ目は関数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
それは正しいですが、「重い」タイプのコンストラクターdataを使用しました。この方法も不便です。追加関数 fgraph によってフラグメントからグラフを取得する必要があります。
この型をコードのさまざまな部分に分割する「美しい」「真の」方法はありますか?