グラフのパズルを解くために、いくつかのデータ構造を作成しようとしています。 Edgeの比較基準を定義しようとしていますが、その方法がわかりません。これまでのところ:
data Edge = Edge (Set String) Bool
エッジが同じ文字列のセットを持ち、ブール値とは関係がない場合に、エッジを等しいと宣言するようにコンパイラに「通知」するにはどうすればよいですか?
ブール値を無視する理由はわかりませんが(興味があります)、そうするには、独自のEq
インスタンスを定義する必要があります。デフォルトのものはすべてのフィールドを比較するため、機能しません。幸いなことに、これは簡単です。
instance Eq Edge where
(Edge s1 _) == (Edge s2 _) = s1 == s2
エッジを並べ替えることができ、並べ替えでセットだけを比較したい場合、実装は非常に似ています。
instance Ord Edge where
(Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2
各型クラスは、実装する必要のある特定のメソッドのセットを定義します。 Eq
には==
または/=
が必要であり、Ord
には<=
またはcompare
が必要です。 (必須の機能とオプションの機能を確認するには、ドキュメントを確認してください。)
import Data.Set
data Edge = Edge (Set String) Bool deriving Show
instance Eq Edge where
(Edge a _) == (Edge b _) = a == b
instance Ord Edge where
compare (Edge a _) (Edge b _) = compare a b