2012-04-21 6 views
11

In Haskell haben wir die Möglichkeit, Einschränkungen für Typen mit einer logischen und zu kombinieren.Wie kann ich zwei Typenbeschränkungen mit einer logischen oder in Haskell kombinieren?

Betrachten Sie die folgende

type And (a :: Constraint) b = (a, b) 

oder mehr kompliziert

class (a, b) => And a b 
instance (a, b) => And a b 

Ich möchte wissen, wie man logisch oder zwei Bedingungen zusammen in Haskell.

Mein nächster Versuch ist das, aber es funktioniert nicht ganz. In diesem Versuch vereinheitliche ich Typ-Constraints mit Tags und definiere sie dann mit impliziten Parametern.

Es funktioniert fast, aber der Benutzer muss den letzten Teil anwenden, und der Compiler sollte das für mich tun. Dieser Fall lässt auch keine dritte Wahl zu, wenn beide Bedingungen erfüllt sind.

Wie kann ich logisch oder zwei Einschränkungen zusammen?

+0

Was ist mit Entweder? Es würde dich klar machen, wenn beide zufrieden sind. –

Antwort

12

Ich glaube, dass es keine Möglichkeit gibt, automatisch eine ROr a b auszuwählen; es würde die Annahme der offenen Welt verletzen, wenn z.B. b war zufrieden, aber später a war auch zufrieden; Jede Konfliktlösungsregel würde notwendigerweise das Hinzufügen einer Instanz zum Ändern des Verhaltens des vorhandenen Codes bewirken.

Das heißt, Kommissionierung R wenn b zufrieden ist, aber a ist bricht nicht die offene Welt Annahme, weil es die Entscheidung beinhaltet, dass eine Instanz nicht erfüllt ist; selbst wenn Sie einen "both satisfied" -Konstruktor hinzufügen, können Sie damit entscheiden, ob eine Instanz nicht vorhanden ist (indem Sie sehen, ob Sie eine L oder eine R erhalten).

Daher glaube ich nicht, dass eine solche oder Einschränkung möglich ist; Wenn Sie beobachten können, welche Instanz Sie erhalten, können Sie ein Programm erstellen, dessen Verhalten sich durch Hinzufügen einer Instanz ändert, und wenn Sie nicht beobachten können, welche Instanz Sie erhalten, ist es ziemlich nutzlos.

Der Unterschied zwischen dieser und der normalen Instanzauflösung, die ebenfalls fehlschlagen kann, ist, dass der Compiler normalerweise nicht entscheiden kann, ob eine Einschränkung erfüllt ist. Hier bitten Sie den Compiler zu entscheiden, dass die Einschränkung nicht erfüllt werden kann. Ein subtiler, aber wichtiger Unterschied.

+0

Wäre es möglich, ein logisches oder was mit möglichen erfüllbaren Constraints anstelle von einfachen erfüllbaren Constraints zu arbeiten? –

Verwandte Themen