Sono sorpreso che non ho trovato una risposta a questo ovunque.Come prendere (e ignorare) una chiamata alla funzione di errore?
Sto scrivendo un roguelike e sto usando la libreria ncurses da hackage, che è un buon wrapper attorno alla libreria ncurses. Ora ncurses ha questa stranezza in cui se provi a scrivere il carattere in basso a destra, lo fa, quindi prova a spostare il cursore sul carattere successivo, poi fallisce perché non c'è nessun posto dove spostarlo. Restituisce un valore di errore che puoi solo ignorare.
Il mio problema è che lo scrittore di librerie haskell ncurses controlla diligentemente eventuali errori su tutte le chiamate e, quando ce n'è uno, chiama: errore "drawText: etc etc.".
In altri linguaggi, come c o python, per aggirare questo si è costretti a ignorare l'errore o catturare e ignorare l'eccezione, ma per la vita di me non riesco a capire come farlo in haskell. La funzione di errore è irrecuperabile?
Modificheremo la libreria localmente per non controllare gli errori su quella funzione se necessario, ma odio farlo. Sono anche aperto a qualsiasi soluzione che mi consenta di disegnare l'ultimo carattere senza spostare il cursore, ma non penso che sia possibile.
Hoogle per "prendere" [1]. Secondo link in basso. [1] http://haskell.org/hoogle/?hoogle=catch –
Sfortunatamente l'errore in questione non è nella monade IO. Beh, inizia in IO, quindi vai a runCurses, che è la monade Maledizioni, quindi updateWindow, che è la monade di aggiornamento. Quindi non credo che la risposta di Paul funzionerà. Ma l'aspetto di luqui ha un potenziale e lo proverò quando torno a casa. –
guardando oltre le ncurse Ho la sensazione che non funzionerà. 'drawText' non chiama' error', ma delega direttamente a una funzione C. E ritorna nel monod di 'Update', che è 'Finestra ReaderT IO a' =' Finestra -> IO a', quindi 'unsafeCleanup' funzionerà solo se si verifica un errore durante la generazione di quella * funzione *, non quando eseguire l'azione (improbabile). Penso che le tue opzioni siano: catturare l'errore in IO al livello più alto, o aprire l'origine curses per farti iniettare una funzione 'catch' più locale. (Può essere fatto facilmente, rompe l'incapsulamento) – luqui