2014-11-21 15 views
12

Sono riuscito a costruire il seguente esempio "minimale" che mostra il mio problema.I sinonimi di pattern portano a pattern matching non esaustivo

fornito estensione delle PatternSynonyms è abilitato

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 

Ho ricevuto un avviso per la funzione f dicendo

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

Se ho sostituito ogni Ve con Vec non si lamenterebbe. Come può il mio singolare pattern sinonimo interferire qui?

risposta

11

Non ancora implementato, vedere #8779. Non mi aspetto qui, ma so che i controlli esaustivi sono difficili da implementare in molti casi, come GADT o guardie. Probabilmente è problematico anche per i sinonimi di pattern.

+0

Sono sicuro che ci sono cose che non ho considerato, ma sembra piuttosto strano che questo non funzioni. Avrei pensato che una semplice espansione macro sarebbe stata sufficiente per sinonimi di qualsiasi tipo. Non vedere come ciò interferirebbe con i controlli di esaustività. Grazie per il link. –

+3

@Luka Non è che sia impossibile, ma qualcuno deve fare il lavoro. I sinonimi di pattern sono uno sforzo totalmente volontario. E tu sei libero di contribuire con un correttore di pattern migliorato, ovviamente. :) – augustss