2017-03-01 4 views
3

Beachten Sie Folgendes:partiell aufgebracht Gleichheit Einschränkung

class (a ~ b) => Equal a b 
instance (a ~ b) => Equal a b 

sagen wir später habe ich einen Datentyp haben:

data D (c :: * -> Constraint) where 
    D :: Proxy c -> D c 

Dann so etwas gilt:

D (Proxy :: (Proxy (Equal Int))) 

Meine Frage ist, gibt es eine Möglichkeit, Equal anders als die repetitive Klasse/Instanz-Notation zu schreiben, die ich verwendet habe?

Es scheint, dass, wenn ich Equal als eine Familie definieren Equal Int nicht funktioniert, weil es eine unvollständige Anwendung ist.

Der Klassen-/Instanz-Hack sieht schlecht aus, aber zumindest funktioniert es, aber gibt es einen anderen vielleicht saubereren Weg, dies zu erreichen?

Hinweis Ich verwende in meinem tatsächlichen Code komplexere Einschränkungen als die Gleichheit, ich dachte nur, dies wäre ein gutes Beispiel.

+0

Ich denke, Proxy ((~) Int) 'funktioniert nicht, aber es wäre nett. – chi

Antwort

4

Sie benötigen keine Klasse, Sie können einfach (~) in Präfixnotation verwenden.

Es gibt einen Fehler in GHC 8.0.1, der manchmal zum Absturz führt, aber es ist nur ein Fehler und in 8.0.2 behoben. Die Klasse/Instanz-Kombination, die Sie beschreiben, ist in der Tat eine effektive Umgehung für diesen Fehler. Wenn Sie keine Rückwärtskompatibilität mit 8.0.1 benötigen, können Sie (~) Int oder Proxy ((~) Int) direkt verwenden.