Подтвердить что ты не робот

Определение собственного Ord для типа данных

Я пытаюсь сделать некоторые структуры данных, чтобы решить загадку графа. Я пытаюсь определить критерии сравнения краев, но я не уверен, как это сделать. До сих пор:

data Edge = Edge (Set String) Bool

Как я могу "сообщить" компилятору, что я хочу, чтобы ребра были объявлены равными, если они имеют одинаковые наборы строк и не имеют равенства, как-то связаны с логическим значением?

4b9b3361

Ответ 1

Хотя я не уверен, почему вы хотите игнорировать логическое значение (мне любопытно), для этого вам нужно будет определить свой собственный экземпляр 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. (Чтобы узнать, какие функции требуются и которые являются необязательными, вы можете проверить документы.)

Ответ 2

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