Testen der Gleichheit zwischen zwei heterogenen Werten

7

Ich verwende die Erweiterung -XExistentialQuantification GHC, um einen heterogenen Container für Werte einer bestimmten Typklasse ( Shape ) zu erstellen:

%Vor%

Wenn alle Instanzen von Shape auch Instanzen von Eq sind, gibt es eine Möglichkeit, Object ebenfalls zu einer Instanz von Eq zu machen?

    
Tom Savage 22.10.2012, 16:45
quelle

3 Antworten

17

Es ist möglich, wenn Sie eine Typeable Einschränkung hinzufügen:

%Vor%

Hier gibt cast y Just y' zurück, wenn der gewünschte Typ von y' (abgeleitet aus der Verwendung von == mit x ) mit dem tatsächlichen Typ von y und Nothing ansonsten übereinstimmt.

    
hammar 22.10.2012, 17:20
quelle
2

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?

    
copumpkin 22.10.2012 16:55
quelle
1

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.

    
sepp2k 22.10.2012 16:55
quelle

Tags und Links