Ich verwende die Erweiterung -XExistentialQuantification
GHC, um einen heterogenen Container für Werte einer bestimmten Typklasse ( Shape
) zu erstellen:
Wenn alle Instanzen von Shape
auch Instanzen von Eq
sind, gibt es eine Möglichkeit, Object
ebenfalls zu einer Instanz von Eq
zu machen?
Nein, weil Eq a
angibt, dass Sie zwei Werte vom Typ a
miteinander vergleichen können. Eine Eq
-Instanz für Ihr Objekt würde es ermöglichen, beliebige Wertepaare (eines beliebigen Typs, der eine Instanz von Shape
darstellt) zu vergleichen.
Wenn ich Shape Int
und Shape Bool
Instanzen habe, wie kann ich Object True
mit Object 1
für Gleichheit vergleichen?
Ein Wert eines Typs, der Eq
implementiert, kann nur mit einem anderen Wert desselben Typs verglichen werden - nicht mit einem anderen Typ, der Eq
implementiert. Wenn Sie also zwei Werte verschiedener Typen haben, können Sie sie nicht vergleichen, auch wenn sie beide Instanzen von Shape
(und somit Eq
) sind. Daher ist es auch unmöglich, eine Eq
-Instanz für Object
zu haben, da eine Object
Werte verschiedener Typen enthalten kann - zumindest mit den EQ-Instanzen der Typen.
Was Sie benötigen, wäre eine Funktion vom Typ (Shape a, Shape b) => a -> b -> Bool
, die verwendet werden kann, um eine beliebige Form mit einer anderen Form zu vergleichen. Wenn Sie eine solche Funktion haben, können Sie damit eine Eq
-Instanz für Object
erstellen. Allerdings können Sie eine solche Funktion nicht so definieren, dass sie mit den Eq
Instanzen des Typs konsistent ist.
Tags und Links haskell ghc existential-type