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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top