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

Дивіться також

Поглиблюйте знання з: