web-dev-qa-db-ja.com

データ型の独自の順序の定義

グラフのパズルを解くために、いくつかのデータ構造を作成しようとしています。 Edgeの比較基準を定義しようとしていますが、その方法がわかりません。これまでのところ:

data Edge = Edge (Set String) Bool

エッジが同じ文字列のセットを持ち、ブール値とは関係がない場合に、エッジを等しいと宣言するようにコンパイラに「通知」するにはどうすればよいですか?

28
Mantas Vidutis

ブール値を無視する理由はわかりませんが(興味があります)、そうするには、独自の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が必要です。 (必須の機能とオプションの機能を確認するには、ドキュメントを確認してください。)

46
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
15