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 предоставляют более традиционную, императивную обработку ошибок через исключения. Но их слишком свободное использование может усложнить вещи, поэтому сообщество часто придерживается типов.

Смотрите также

Углубитесь с помощью: