Data.Maybe
Data.Maybe
Data.Maybe 모듈은 선택적인(optional) 값을 나타내는 Maybe 타입과 그에 대한 연산들을 제공해요.
본문
21.1 Maybe 타입과 연산 (The Maybe type and operations)
data Maybe a = Nothing | Just a
Maybe 타입은 선택적인 값을 캡슐화해요. Maybe a 타입의 값은 a 타입의 값을 담고 있거나(Just a로 표현), 비어 있거나(Nothing으로 표현) 해요. Maybe를 사용하는 것은 error 같은 극단적인 수단에 의존하지 않고 오류나 예외적인 경우를 다루는 좋은 방법이에요.
Maybe 타입은 또한 모나드예요. 모든 오류가 Nothing으로 표현되는 단순한 종류의 오류 모나드(error monad)예요. 더 풍부한 오류 모나드는 Data.Either.Either 타입을 사용해 만들 수 있어요.
instance Monad Maybe
instance Functor Maybe
instance MonadPlus Maybe
instance Eq a => Eq (Maybe a)
instance Ord a => Ord (Maybe a)
instance Read a => Read (Maybe a)
instance Show a => Show (Maybe a)
maybe :: b -> (a -> b) -> Maybe a -> b
maybe 함수는 기본 값, 함수, Maybe 값을 받아요. Maybe 값이 Nothing이면 함수는 기본 값을 돌려줘요. 그렇지 않으면 Just 안의 값에 함수를 적용하고 그 결과를 돌려줘요.
isJust :: Maybe a -> Bool
isJust 함수는 인자가 Just _ 형태이면 True를 돌려줘요.
isNothing :: Maybe a -> Bool
isNothing 함수는 인자가 Nothing이면 True를 돌려줘요.
fromJust :: Maybe a -> a
fromJust 함수는 Just에서 요소를 추출하고, 인자가 Nothing이면 오류를 던져요.
fromMaybe :: a -> Maybe a -> a
fromMaybe 함수는 기본 값과 Maybe 값을 받아요. Maybe가 Nothing이면 기본 값을 돌려주고, 그렇지 않으면 Maybe 안에 담긴 값을 돌려줘요.
listToMaybe :: [a] -> Maybe a
listToMaybe 함수는 빈 리스트에서는 Nothing을 돌려주고, 그렇지 않으면 Just a를 돌려줘요. 여기서 a는 리스트의 첫 번째 요소예요.
maybeToList :: Maybe a -> [a]
maybeToList 함수는 Nothing이 주어지면 빈 리스트를 돌려주고, Nothing이 아니면 단일 요소 리스트(singleton list)를 돌려줘요.
catMaybes :: [Maybe a] -> [a]
catMaybes 함수는 Maybe들의 리스트를 받아 모든 Just 값들의 리스트를 돌려줘요.
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
mapMaybe 함수는 요소를 버릴 수 있는 버전의 map이에요. 특히 함수 인자는 Maybe b 타입의 무언가를 돌려줘요. 이것이 Nothing이면 결과 리스트에 요소가 추가되지 않아요. Just b이면 b가 결과 리스트에 포함돼요.
21.2 명세 (Specification)
module Data.Maybe(
Maybe(Nothing, Just), isJust, isNothing,
fromJust, fromMaybe, listToMaybe,
maybeToList, catMaybes, mapMaybe, maybe
) where
maybe :: b -> (a -> b) -> Maybe a -> b
maybe n _ Nothing = n
maybe _ f (Just x) = f x
isJust :: Maybe a -> Bool
isJust (Just a) = True
isJust Nothing = False
isNothing :: Maybe a -> Bool
isNothing = not . isJust
fromJust :: Maybe a -> a
fromJust (Just a) = a
fromJust Nothing = error "Maybe.fromJust: Nothing"
fromMaybe :: a -> Maybe a -> a
fromMaybe d Nothing = d
fromMaybe d (Just a) = a
maybeToList :: Maybe a -> [a]
maybeToList Nothing = []
maybeToList (Just a) = [a]
listToMaybe :: [a] -> Maybe a
listToMaybe [] = Nothing
listToMaybe (a:_) = Just a
catMaybes :: [Maybe a] -> [a]
catMaybes ms = [ m | Just m <- ms ]
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
mapMaybe f = catMaybes . map f
더 알아보기 (Learn more)
Maybe는 단순한 오류 모나드이므로, 모나드의 기본 개념은Control.Monad모듈에서 함께 볼 수 있어요.- 더 풍부한 오류 처리가 필요하다면
Data.Either타입을 참고해요. Maybe조합 기법(do표기법,Functor·Applicative연산) 등은 실전 Haskell 관용구를 설명하는 자료에서 다뤄요.