Come gestire questa eccezione?
Domanda
Haskell mi sta facendo venire il mal di testa oggi. Voglio gestire un'eccezione. Quando arriva in cima, stampa in questo modo:
*** Eccezione: ../p/trip/Trip.hs:(88,16)-(89,50): schemi non esaustivi nella suddivisione delle funzioni
A me sembra che sia PatternMatchFail, ma questo non funziona:
handle (\(PatternMatchFail _) -> return env) f
Voglio dire, si compila, ma non gestisce l'eccezione. Che cosa sto facendo di sbagliato? È questa l'eccezione sbagliata o cosa? C'è un modo per cogliere qualche eccezione?
Soluzione
Se correggere l'origine dell'errore non è un'opzione, dovresti guardare questo: http://www.haskell.org/ ghc / docs / ultima / html / librerie / base / controllo-Exception.html
Credo che usando " handle " o " prova " o "cattura" o qualunque cosa da Control.Exception è la chiave qui, le funzioni nel preludio standard riguardano solo le IO-Exceptions, non gli errori nel codice puro.
In Haskell98, il codice puro non può gestire le eccezioni. Le funzioni pure devono restituire un valore, un'eccezione è l'incapacità di restituire un valore.
Esempio:
import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"
main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
C.handle (\_ -> return "caught") (C.evaluate y) >>= print
La chiamata a valutare è forzare la valutazione di xey, essendo haskell pigro e tutto il resto.
Se lasci che la valutazione di x sia rinviata in seguito (pigramente), l'eccezione verrà anche lanciata successivamente, in un posto diverso (in questo caso è "stampa" che utilizza il valore), dove potrebbe non essere catturato.