Haskell:
Manejo de errores

Cómo hacerlo:

Haskell maneja errores de manera sólida a través de tipos como Maybe y Either. Aquí hay un vistazo rápido:

safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing  -- Dividir por cero no está permitido, así que retornamos Nothing.
safeDivide x y = Just (x `div` y)  -- De lo contrario, estamos bien, devolvemos el resultado en un Just.

-- Veámoslo en acción:
example1 :: Maybe Int
example1 = safeDivide 10 2  -- Just 5

example2 :: Maybe Int
example2 = safeDivide 10 0  -- Nothing

Para un manejo de errores más complejo, entra en juego Either:

safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Error de división por cero."  -- Esta vez, el error lleva un mensaje.
safeDivideEither x y = Right (x `div` y)

-- Y en uso:
example3 :: Either String Int
example3 = safeDivideEither 10 2  -- Right 5

example4 :: Either String Int
example4 = safeDivideEither 10 0  -- Left "Error de división por cero."

Inmersión Profunda

En el mundo de Haskell, el manejo de errores tiene una larga historia. Antiguamente, los errores podían derribar todo tu programa—nada divertido. El sistema de tipos de Haskell ofrece caminos para hacer esto mucho menos probable. Tenemos Maybe y Either, pero hay otros como Exceptions y IO para diferentes escenarios.

Maybe es simple: obtienes Just algo si todo va bien, o Nothing si no es así. Either lo lleva al siguiente nivel, permitiéndote devolver un mensaje de error (Left) o un resultado exitoso (Right).

Ambos son puros, lo que significa que no alteran el mundo exterior, un gran tema en Haskell. Evitamos las trampas de excepciones no comprobadas que aquejan a algunos otros lenguajes.

Para aquellos que no están satisfechos con Maybe y Either, bibliotecas como Control.Exception ofrecen un manejo de errores más tradicional y de estilo imperativo a través de excepciones. Pero usarlas demasiado libremente puede complicar las cosas, por lo que la comunidad a menudo se adhiere a los tipos.

Ver También

Profundice con: