Questo è un follow-up di Why am I getting "Non-exhaustive patterns in function..." when I invoke my Haskell substring function?In Haskell, perché i pattern non esaustivi non sono errori in fase di compilazione?
intendo che usando -Wall
, GHC può avvisare contro modelli non esaustive. Mi chiedo qual è la ragione che sta dietro non fare un errore di compilazione di default dato che è sempre possibile definire in modo esplicito una funzione parziale:
f :: [a] -> [b] -> Int
f [] _ = error "undefined for empty array"
f _ [] = error "undefined for empty array"
f (_:xs) (_:ys) = length xs + length ys
Il problema non è specifico GHC-.
Forse perché ...
- nessuno voleva far rispettare un compilatore Haskell per eseguire questo tipo di analisi?
- una ricerca di modello non esaustiva può trovare alcuni ma non tutti i casi?
- funzioni parzialmente definite sono considerati legittimi e utilizzati abbastanza spesso non imporre il tipo di costrutto sopra indicato? Se questo è il caso, puoi spiegarmi perché schemi non esaustivi sono utili/legittimi?
Un altro caso piuttosto comune sarebbe dichiarazioni lambda all'interno di una guardia/caso/se ramo. Sai che l'argomento ha una certa forma a causa del ramo in cui ti trovi, quindi includerlo nel lambda non è necessario. –
Non penso che dovrebbe essere scritto come altrimenti. È una grande definizione di mod2 anche se il compilatore pensa che non sia esaustivo. Sono arrivato a questa domanda perché ho ottenuto questo errore scrivendo una funzione fib che non dovrebbe essere definita per numeri interi negativi. –
forse questo è fuori portata, ma sta decidendo se una corrispondenza di modello è esauriente o non correlata al problema di interruzione? intuitivamente sembra un linguaggio scritto in modo così rigoroso come haskell dovrebbe abilitare questo tipo di analisi, almeno per i sottoinsiemi del linguaggio, ma so che l'istinto istintivo di solito è un modo orribile per indovinare se qualcosa è calcolabile o meno. – kai