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 во имя добра!”