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?
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. –
@ 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