Haskell:
Обработка ошибок
Как:
Haskell обрабатывает ошибки надежно через такие типы, как Maybe
и Either
. Взглянем быстрее:
safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing -- Деление на ноль невозможно, поэтому возвращаем Nothing.
safeDivide x y = Just (x `div` y) -- В противном случае, все хорошо, возвращаем результат в Just.
-- Давайте посмотрим на примере:
example1 :: Maybe Int
example1 = safeDivide 10 2 -- Just 5
example2 :: Maybe Int
example2 = safeDivide 10 0 -- Nothing
Для более сложной обработки ошибок используется Either
:
safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Ошибка деления на ноль." -- На этот раз ошибке сопутствует сообщение.
safeDivideEither x y = Right (x `div` y)
-- И в использовании:
example3 :: Either String Int
example3 = safeDivideEither 10 2 -- Right 5
example4 :: Either String Int
example4 = safeDivideEither 10 0 -- Left "Ошибка деления на ноль."
Углубленно
В мире Haskell обработка ошибок имеет долгую историю. Раньше ошибки могли полностью остановить вашу программу — не весело. Система типов Haskell предлагает способы сделать это гораздо менее вероятным. У нас есть Maybe
и Either
, но есть и другие, такие как Exceptions
и IO
для различных сценариев.
Maybe
прост: вы получаете Just
что-то, если все в порядке, или Nothing
, если нет. Either
шаг вперед, позволяя вам возвращать сообщение об ошибке (Left
) или успешный результат (Right
).
Оба они чистые, то есть не взаимодействуют с внешним миром — большое дело в Haskell. Мы избегаем ловушек непроверенных исключений, которые мучают некоторые другие языки.
Для тех, кто не удовлетворен Maybe
и Either
, библиотеки вроде Control.Exception
предоставляют более традиционную, императивную обработку ошибок через исключения. Но их слишком свободное использование может усложнить вещи, поэтому сообщество часто придерживается типов.
Смотрите также
Углубитесь с помощью:
- Собственная документация Haskell: Haskell
- Отлично для начинающих: “Изучай Haskell во имя добра!”