Je suis surpris de ne pas trouver de réponse à cela. J'écris un roguelike et j'utilise la bibliothèque ncurses de hackage, qui est un très bon wrapper autour de la bibliothèque ncurses. Maintenant ncurses a cette bizarrerie où si vous essayez d'écrire le caractère en bas à droite, il le fait, puis il essaie de déplacer le curseur sur le caractère suivant, puis il échoue parce qu'il n'y a nulle part où le déplacer. Il renvoie une valeur d'erreur que vous ne pouvez ignorer. Mon problème est que l'auteur de la bibliothèque haskell ncurses vérifie scrupuleusement les erreurs sur tous les appels, et lorsqu'il y en a un, il appelle: error "drawText: etc etc.". Pour contourner ce problème, dans d'autres langages, comme c ou python, vous êtes obligé d'ignorer l'erreur ou d'attraper et d'ignorer l'exception, mais pour la vie de moi, je n'arrive pas à comprendre comment le faire en haskell. La fonction d'erreur est-elle irrécupérable?Comment attraper (et ignorer) un appel à la fonction d'erreur?
Je vais modifier la bibliothèque localement pour ne pas vérifier les erreurs sur cette fonction si je dois, mais je déteste faire cela. Je suis également ouvert à toute solution de contournement qui me permettrait de dessiner ce dernier caractère sans déplacer le curseur, mais je ne pense pas que ce soit possible.
Hoogle pour "catch" [1]. Deuxième lien vers le bas. [1] http://haskell.org/hoogle/?hoogle=catch –
Malheureusement, l'erreur en question n'est pas dans la monade IO. Eh bien, il commence dans IO, alors vous allez runCurses, qui est la monade Curses, puis updateWindow, qui est la monade de mise à jour. Par conséquent, je ne pense pas que la réponse de Paul fonctionnera. Mais Luqui a l'air d'avoir du potentiel et je vais l'essayer quand je serai à la maison. –
regardant par-dessus ncurses J'ai l'impression que ça ne marchera pas. 'drawText' n'appelle pas' error', il délègue directement à une fonction C. Et il retourne dans la monade 'Update', qui est' ReaderT Window IO a' = 'Fenêtre -> IO a', donc 'unsafeCleanup' ne fonctionnera que s'il a des erreurs lors de la génération de cette * fonction *, pas quand exécuter l'action (peu probable). Je pense que vos options sont: attraper l'erreur dans IO au niveau supérieur, ou ouvrir la source curses pour vous permettre d'injecter une fonction 'catch' plus locale. (Il peut être fait facilement, casse juste l'encapsulation) – luqui