Open philosucker opened 4 months ago
import Control.Applicative
validateName :: String -> Maybe String
validateName name
| length name > 0 = Just name
| otherwise = Nothing
validateAge :: Int -> Maybe Int
validateAge age
| age > 0 = Just age
| otherwise = Nothing
data User = User String Int deriving Show
-- 애플리케이티브 펑터를 사용하여 이름과 나이를 검증하고 User 타입을 생성
createUser :: Maybe String -> Maybe Int -> Maybe User
createUser name age = User <$> validateName name <*> validateAge age
exampleApplicative :: Maybe User
exampleApplicative = createUser (Just "Alice") (Just 30) -- 결과: Just (User "Alice" 30)
exampleApplicativeFail :: Maybe User
exampleApplicativeFail = createUser (Just "") (Just (-1)) -- 결과: Nothing
import Control.Monad (when)
-- 사용자의 나이를 받아 성인인 경우에만 나이를 반환하는 함수
checkAdult :: Int -> Maybe Int
checkAdult age = if age >= 18 then Just age else Nothing
-- 성인의 나이를 받아, 특정 조건(예: 65세 이상)에 따라 은퇴 가능 여부를 검사하는 함수
checkRetirement :: Int -> Maybe String
checkRetirement age = if age >= 65 then Just "Eligible for retirement" else Just "Not eligible for retirement yet"
-- 연속적인 작업 수행
processUserAge :: Int -> Maybe String
processUserAge age =
checkAdult age >>= checkRetirement
-- 예제 실행
exampleMonad :: Maybe String
exampleMonad = processUserAge 70 -- 결과: Just "Eligible for retirement"
exampleMonadFail :: Maybe String
exampleMonadFail = processUserAge 17 -- 결과: Nothing
Applicative Functor (서로 같은 컨텍스트 포함)서로 다른 컨텍스트를 가진 값 여러 개를 동시에 입력 받고 이들 값들이 모두 유효할 때만, 컨텍스트를 유지하면서 결과를 (필요시 새로운 컨텍스트의 값을) 반환하는 함수를 만들 때 주로 사용?
Monad 컨텍스트를 가진 값을 다른 컨텍스트를 가진 값으로 (또는 기존 컨텍스트를 유지하면서) 연속적으로 변환시키고 그 변환과정에서 유효한 단계까지는 올바르게 처리하고, 그렇지 않은 경우는 예외처리를 하는 함수를 만들때 주로 사용?
다른 차이들도 있을 텐데 위와 같은 구분도 적절한 걸까요?