Haskell:
에러 처리하기

방법:

하스켈은 MaybeEither와 같은 타입을 통해 강력한 에러 처리를 합니다. 간단한 살펴보기입니다:

safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing  -- 0으로 나누는 것은 안됩니다, 그래서 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 "Divide by zero error."  -- 이번에는 에러가 메시지를 가지고 있습니다.
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 "Divide by zero error."

심도 있는 탐구

하스켈 세계에서, 에러 처리는 강력한 역사를 가지고 있습니다. 옛날에는, 에러가 전체 프로그램을 망가뜨릴 수 있었습니다—재미없죠. 하스켈의 타입 시스템은 이를 훨씬 덜 가능하게 만드는 방법을 제공합니다. 우리는 MaybeEither를 가지고 있지만, 다른 시나리오에 대한 ExceptionsIO와 같은 다른 것들도 있습니다.

Maybe는 간단합니다: 모든 것이 잘 되었을 때는 Just 무언가를 받고, 그렇지 않으면 Nothing을 받습니다. Either는 한 단계 더 나아가, 에러 메시지(Left) 또는 성공적인 결과(Right)를 반환할 수 있게 합니다.

둘 다 순수하며, 외부 세계에 영향을 끼치지 않습니다 – 하스켈에서 큰 문제입니다. 우리는 다른 언어들을 괴롭히는 검사되지 않은 예외의 함정을 피합니다.

MaybeEither로 만족하지 않는 사람을 위해, Control.Exception과 같은 라이브러리들은 예외를 통해 더 전통적인, 명령형 스타일의 에러 처리를 제공합니다. 하지만 이를 너무 자유롭게 사용하는 것은 복잡해질 수 있으므로, 커뮤니티는 종종 타입을 사용하는 것을 선호합니다.

더 보기

더 깊이 탐구하려면 다음을 참조하세요: