una telefonicos telefonico recibo rechazas que porque pasa numeros movistar molestas molestan llamadas llamada identificar cuando celular bloquear bloqueados exception haskell exception-handling referential-transparency

exception - telefonicos - ¿Cómo detectar(e ignorar) una llamada a la función de error?



que pasa cuando rechazas una llamada (2)

Me sorprende que no pude encontrar una respuesta a esto en ninguna parte.

Estoy escribiendo un roguelike y estoy usando la biblioteca ncurses de hackage, que es una envoltura bastante buena alrededor de la biblioteca ncurses. Ahora ncurses tiene esta peculiaridad en la que si intenta escribir el carácter inferior derecho, lo hace, luego intenta mover el cursor al siguiente carácter, luego falla porque no hay dónde moverlo. Devuelve un valor de error que solo puede ignorar.

Mi problema es que el escritor de la biblioteca de haskell ncurses verifica de forma diligente cualquier error en todas las llamadas, y cuando hay uno, llama: error "drawText: etc.".

En otros idiomas, como c o python, para sortear esto, se ve obligado a ignorar el error o atrapar e ignorar la excepción, pero por mi vida no puedo descubrir cómo hacerlo en haskell. ¿La función de error es irrecuperable?

Modificaré la biblioteca localmente para no verificar errores en esa función si tengo que hacerlo, pero odio hacerlo. También estoy abierto a cualquier solución que me permita dibujar ese último carácter sin mover el cursor, pero no creo que sea posible.


Puedes hacerlo usando catch desde Control.Exception . Sin embargo, tenga en cuenta que debe estar en la mónada IO para hacer esto.

import qualified Control.Exception as Exc divide :: Float -> Float -> Float divide x 0 = error "Division by 0." divide x y = x / y main :: IO () main = Exc.catch (print $ divide 5 0) handler where handler :: Exc.ErrorCall -> IO () handler _ = putStrLn $ "You divided by 0!"


se supone que el error es tan observable como un bucle infinito. Solo puedes detectar el error en IO , que es como decir "sí, si sabes magia". Pero desde la parte realmente agradable de Haskell, el código puro, es irrecuperable, y por lo tanto, se recomienda encarecidamente que no se use en su código, solo lo mismo que un ciclo infinito como un código de error.

ncurses es ser grosero y hacer que hagas magia para corregirlo. Yo diría que unsafePerformIO estaría garantizado para limpiarlo. Aparte de eso, esto es en gran medida lo mismo que la respuesta de Pablo.

import qualified Control.Exception as Exc {-# NOINLINE unsafeCleanup #-} unsafeCleanup :: a -> Maybe a unsafeCleanup x = unsafePerformIO $ Exc.catch (x `seq` return (Just x)) handler where handler exc = return Nothing `const` (exc :: Exc.ErrorCall)

Luego, envuelva unsafeCleanup alrededor de cualquier valor que pudiera evaluar un error para convertirlo en Maybe .