Si raccomanda di avere sempre corrispondenze di pattern esaurienti in Haskell, anche per casi "impossibili"?Si raccomanda di avere sempre corrispondenze di pattern esaurienti in Haskell, anche per casi "impossibili"?
Ad esempio, nel seguente codice, I am pattern matching sull'accumulatore di un foldr. Ho il controllo completo del contenuto dell'accumulatore, perché lo creo (non è passato a me come input, ma piuttosto costruito all'interno della mia funzione). Pertanto, so che alcuni modelli non dovrebbero mai combaciare. Se mi sforzerò di non ottenere mai l'errore "Pattern match (es) non-exhaustive", allora inserirò un pattern match che semplicemente l'errore con il messaggio "Questo pattern non dovrebbe mai accadere". Molto simile a un assert in C#. Non riesco a pensare a nient'altro da fare lì.
Quale pratica consiglieresti in questa situazione e perché?
Ecco il codice:
gb_groupBy p input = foldr step [] input
where
step item acc = case acc of
[] -> [[item]]
((x:xs):ys) -> if p x item
then (item:x:xs):ys
else [item]:acc
Il pattern non corrisponde (come riportato dall'interprete) è:
Attenzione: corrispondenza di schema (es) sono non esaustivo In un caso alternativo: Reticoli non abbinato: []: _
La cosa fastidiosa qui è che per silenziare l'avviso si finisce spesso per inserire un messaggio di errore di runtime meno utile. Mi piacerebbe solo riconoscere il caso mancante, ma consentire il testo di errore di runtime predefinito (che punta al numero di file/linea) da utilizzare. –
Questo è un grande punto. Immagino che al momento non ci sia modo di farlo. Peccato. –
vedere anche http://stackoverflow.com/questions/1882334 – sdcvvc