monad-lab / study

2 stars 1 forks source link

[CH13] Applicative Functor 와 Monad 의 차이 #78

Open philosucker opened 4 months ago

philosucker commented 4 months ago

Applicative Functor (서로 같은 컨텍스트 포함)서로 다른 컨텍스트를 가진 값 여러 개를 동시에 입력 받고 이들 값들이 모두 유효할 때만, 컨텍스트를 유지하면서 결과를 (필요시 새로운 컨텍스트의 값을) 반환하는 함수를 만들 때 주로 사용?

Monad 컨텍스트를 가진 값을 다른 컨텍스트를 가진 값으로 (또는 기존 컨텍스트를 유지하면서) 연속적으로 변환시키고 그 변환과정에서 유효한 단계까지는 올바르게 처리하고, 그렇지 않은 경우는 예외처리를 하는 함수를 만들때 주로 사용?

다른 차이들도 있을 텐데 위와 같은 구분도 적절한 걸까요?

philosucker commented 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
philosucker commented 4 months ago
            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