2014-07-15 7 views
6

Ich bin auf eine Situation gestoßen, in der ich Musteranpassungen auf Operatoren vornehmen möchte. Dies löst jedoch einen Pattern match(es) are overlapped Fehler mit GHC. Ich kann nicht herausfinden, warum. Ist ein Mustervergleich auf Operatoren nicht erlaubt? Ich nehme an, dass seit dem Einschließen eines Operator-Symbols in Klammern converts it into an identifier dies funktioniert haben sollte.Musterübereinstimmung (en) sind überlappt - Musteranpassung auf Operatoren

Es gibt andere Möglichkeiten, die ich erreichen kann, was ich tun möchte. Ich bin nur neugierig, warum das nicht funktioniert.

+9

Ihre erste Zeile entspricht einer beliebigen Funktion und bindet sie lokal an den Infix-Operator +. Die nachfolgenden Zeilen sind somit überforderungsbedürftig, daher die Warnung. Beachten Sie, dass Funktionssymbole, Infix oder nicht, alle lokal durch Musterabgleich auf diese Weise wiederhergestellt werden können. Nur großgeschriebene Konstruktoren (oder: -fixierte Infix-Konstruktoren) und Literale stimmen nur mit sich selbst und dann nur mit Typen erster Ordnung überein. Haskell gibt (fast) keine Möglichkeit, die intensionalen Eigenschaften von Funktionen zu untersuchen: (Nebenbei bemerkt) Sie können nur ihre Dehnungseigenschaften ausnutzen, indem Sie sie anwenden. "Ist das die + Funktion?" ist nicht erlaubt. – pigworker

+0

@pigworker, dies erklärt, warum ich die Botschaft "Diese Bindung überschattet die bestehende Auflösungsdefinition" bekommen habe. Danke für die Information. –

Antwort

12

(+) und (-) sind nicht Bauer vom Typ Integer -> Integer -> Integer:

  • Sie sind nicht Konstruktor Namen
  • Integer -> Integer -> Integer ist nicht ein algebraischer Datentyp

Und so Ihr Code entspricht jeden zu verwenden andere Variablennamen, um das erste Argument zu binden, z

was hoffentlich macht klar, dass alle drei Muster tatsächlich alles (und die ersten beiden binden einige Namen) übereinstimmen. Mit anderen Worten, das erste Muster (foo oder (+) in Ihrem Beispiel) kann nicht durchfallen, weshalb es sich mit den restlichen zwei überlappt.

+0

verstanden. Vielen Dank! –

Verwandte Themen