2014-11-21 19 views
12

Udało mi się skonstruować następujący "minimalny" przykład, który pokazuje mój problem.Synonimy wzorca prowadzą do niewyczerpującego dopasowywania wzorca

Pod warunkiem przedłużenia obowiązywania PatternSynonyms jest włączona

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 

dostaję ostrzeżenie dla funkcji f mówiąc

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

Gdybym zastąpić każdą Ve z Vec że nie będzie narzekać. W jaki sposób występuje tu mój synonim wzorca?

Odpowiedz

11

Nie jest jeszcze zaimplementowany, patrz #8779. Nie oczekuję tutaj, ale wiem, że kontrole wyczerpujące są trudne do wdrożenia w wielu przypadkach, takich jak GADT lub strażnicy. Prawdopodobnie problem dotyczy również synonimów wzoru.

+0

Jestem pewien, że są rzeczy, których nie rozważałem, ale wydaje się dość dziwne, że to nie działa. Założę się, że proste rozszerzenie makr będzie wystarczające dla synonimów jakiegokolwiek rodzaju. Nie widzę, jak mogłoby to wpłynąć na kontrole kompletności. Dzięki za link. –

+3

@ Luka Nie chodzi o to, że to niemożliwe, ale ktoś musi wykonać pracę. Synonimy wzoru są całkowicie wolontariuszem. I oczywiście możesz wnieść ulepszony sprawdzacz wzorów. :) – augustss

Powiązane problemy