4

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 によってフラグメントからグラフを取得する必要があります。

この型をコードのさまざまな部分に分割する「美しい」「真の」方法はありますか?

4

1 に答える 1