Skip to content

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

Description

@philosucker

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

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

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

Activity

  1. philosucker commented on Apr 13, 2024

    @philosucker
    Author
    				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
    
  2. philosucker commented on Apr 13, 2024

    @philosucker
    Author
    			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
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions