Sie brauchen nur O (n) (2 n-1, um genau zu sein) Definitionen insgesamt Reihenfolge festlegen, solange man die Fälle, in ansteigender Reihenfolge ihrer Priorität angeben:
instance Ord FooPriorityA where
compare (FooPriorityA x) (FooPriorityA y) | x == y = EQ -- Use the Eq instance
-- Bar is the smallest
| x == Bar = LT
| y == Bar = GT
-- Baz is the next smallest
| x == Baz = LT
| y == Baz = GT
-- Proceed in the desired order.
-- You don't need to say anything
-- explicit about the largest value
Der erste Fall (x == y
) deckt O (n) Möglichkeiten ab. Jeder folgende Fall mag unvollständig aussehen, aber er enthält die implizierte Information, dass jeder vorhergehende Fall falsch ist. Zum Beispiel bedeutet x == Bar = LT
nicht, dass jeder Fall, in dem x == Bar
zu LT
auswertet; der Fall, wo x == Bar && y == Bar
bereits behandelt wird, so ist der zweite Fall wirklich implizit .
Ebenso Fall 4 (x == Baz
) trägt, die Annahme, dass y /= Baz
(implizierte durch den Ausfall von Fall 1 übereinstimmen) und y /= Bar
(implizit durch den Ausfall von Fall 3 zu entsprechen). Daher ist jeder verbleibende mögliche Wert für y
tatsächlich größer als Baz
.
Je weiter unten auf der Liste Sie gehen, desto weniger unbearbeitete Fälle bleiben. Am Ende müssen Sie nichts über den größten Gegenstand sagen; alle Informationen darüber, wie es mit den anderen n - 1 Elemente vergleicht, wurde bereits von den vorhergehenden Fällen erfasst.
Auch bedenken Sie, dass Ihre Definition von f
eine Hälfte (fromEnum
) der minimalen Implementierung einer Instanz der Enum
Klasse, die Sie dann Ihre Ord
Instanz definieren, verwenden könnte.
instance Enum FooPriorityA where
fromEnum Bar = 1
fromEnum Baz = 2
fromEnum Qux = 3
toEnum 1 = Bar
toEnum 2 = Baz
toEnum 3 = Qux
instance Ord FooPriorityA where
compare x y = compare (fromEnum x) (fromEnum y)
-- compare = compare `on` Data.Function.fromEnum
Das sind fantastische Informationen, danke. Die Beobachtung über die Beziehung zwischen meiner 'f' und der' Enum' Klasse ist faszinierend. – SimonF