2014-11-21 6 views
12

Ich habe geschafft, das folgende "minimale" Beispiel zu konstruieren, das mein Problem zeigt.Muster Synonyme führen zu unerschöpflichen Mustererkennung

Sofern die PatternSynonyms Erweiterung

aktiviert
data Vec = Vec Int Int 

pattern Ve x y = Vec x y 

f :: (Vec, Vec) -> Vec 
f ([email protected](Ve a b), Ve c d) 
    | a > b  = Vec c d 
    | otherwise = v 

ich eine Warnung für die Funktion erhalten f

Warning: Pattern match(es) are non-exhaustive 
    In an equation for `f': Patterns not matched: (_, _) 

sagen, wenn ich jeden Ve mit Vec ersetzt würde es nicht beschweren. Wie interferiert mein singuläres Muster-Synonym hier?

Antwort

11

Es ist noch nicht implementiert, siehe #8779. Ich bin hier nicht zu erwarten, aber ich weiß, dass Vollständigkeitsprüfungen in vielen Fällen, wie GADT oder Wachen, schwer zu implementieren sind. Wahrscheinlich ist es auch für Muster-Synonyme problematisch.

+0

Ich bin sicher, es gibt Sachen, die ich nicht in Betracht gezogen habe, aber es scheint ziemlich seltsam, dass das nicht funktioniert. Ich hätte angenommen, dass eine einfache Makroexpansion für Synonyme jeglicher Art ausreichen würde. Sehen Sie nicht, wie dies die Überprüfung der Vollständigkeit beeinträchtigen würde. Danke für den Link. –

+3

@Luka Es ist nicht so, dass es unmöglich ist, aber jemand muss die Arbeit machen. Muster-Synonyme sind eine absolut freiwillige Anstrengung. Und Sie können natürlich einen verbesserten Musterprüfer beisteuern. :) – augustss