"학습 총화 - Haskell - 6" Haskell 중요 프로 그래 밍 모델 - Functor, Applicative, Monad

Haskell 중요 프로 그래 밍 모드 - Functor, Applicative Functor, Monad
Table of Contents
  • 1 Haskell 기본 지식
  • 2 Haskell 중요 데이터 구조 - list
  • 3 Haskell 상용 데이터 구조
  • 4 Haskell 유형
  • 5 Haskell 중요 개념 - 함수
  • 6 Haskell 중요 프로 그래 밍 모델 - Functor, Applicative Functor, Monad
  • 6.1 Functor
  • 6.1.1 Functor 의 기본 개념
  • 6.1.2 Functor 인 스 턴 스 -- Maybe
  • 6.2 Applicative Functor
  • 6.2.1 Applicative Functor 기본 개념
  • 6.2.2 Applicative Functor 인 스 턴 스 -- Maybe
  • 6.2.3 어 플 리 케 이 션 스타일
  • 6.3 Monad
  • 6.3.1 Monad 의 기본 개념
  • 6.3.2 Monad 인 스 턴 스 - Maybe


  • 1 하 스 켈 기본 지식
    2 Haskell 중요 데이터 구조 - list
    3 Haskell 상용 데이터 구조
    4 Haskell 타 입
    5 Haskell 중요 개념 - 함수
    6 Haskell 중요 프로 그래 밍 모드 - Functor, Applicative Functor, Monad
    6.1 Functor
    6.1.1 Functor 의 기본 개념
    Functor 는 하나의 유형 류 (type class) 입 니 다. 먼저 그것 이 어떻게 실현 되 는 지 본 다음 에 몇 가지 예 를 통 해 Functor 가 무엇 인지, 그리고 왜 이런 개념 을 추상 화 해 야 하 는 지 알 수 있 습 니 다.
    class Functor f where  
        fmap :: (a -> b) -> f a -> f b  
    

    여기 있 는 a, b 는 유형 매개 변수 (type variable) 이 고 f 는 유형 구조 자 (type constructor) 이 며 앞에서 말 한 값 구조 자 (value constructor) 와 유사 하 며 (f a) 는 새로운 유형 을 구성 합 니 다.예 를 들 어 f 는 Maybe, a 는 Int, Float, etc. (Maybe Int), (Maybe Float) 이런 것들 이 바로 새로운 유형 이다.fmap 를 보면 자 연 스 럽 게 함수 가 생각 납 니 다. map
    map :: (a -> b) -> [a] -> [b]
    

    fmap 와 map 를 비교 해 보면 그들 이 매우 비슷 하 다 는 것 을 알 수 있 습 니 다. f a 를 [a] 로 바 꾸 면 됩 니 다. 방금 f a 는 하나의 유형 이 라 고 말 했 습 니 다. a 를 유형 매개 변수 로 합 니 다. 만약 에 우리 가 f 를 List 로 한다 면 f a 는 List a 입 니 다. List a 를 [a] 로 쓰 면 famp 는 map 로 예화 되 었 습 니 다. 즉, map 는 fmap 의 특례 에 불과 합 니 다.이것 은 List 가 Functor 의 인 스 턴 스 (instance) 라 는 것 이다. 즉,
    instance Functor [] where  
        fmap = map 
    

    List 는 Functor 의 인 스 턴 스 로 서 fmap 를 실현 해 야 하 며, List 의 fmap 는 map 함수 입 니 다.
    ghci>fmap (*2) [1,2,3]
    [2,4,6]
    ghci>map (*2) [1,2,3]
    [2,4,6]
    

    6.1.2 Functor 실례 -- 어쩌면
    먼저 유명한 메 이 비 를 소개 하 겠 습 니 다. 메 이 비의 정 의 는?
    data Maybe a = Just a | Nothing
         deriving (Eq, Ord)
    

    왜 Maybe 의 개념 을 도입 해 야 합 니까? 왜냐하면 가끔 은 같은 함수 의 반환 값 이 잘못된 것 일 수도 있 고 구체 적 인 값 일 수도 있 습 니 다. 예 를 들 어 부동 소수점 값 일 수도 있 습 니 다. 이때 함수 의 반환 값 을 Maybe Float 로 설정 할 수 있 습 니 다.
    mDivide :: Float -> Float -> Maybe Float
    mDivide _ 0 = Nothing
    mDivide x y = Just (x/y)
    
    ghci>mDivide 4.3 0
    Nothing
    ghci>mDivide 4.3 2
    Just 2.15
    

    Maybe 를 Functor 의 인 스 턴 스 라면, 우 리 는 함 수 를 Maybe 형식의 값 에 작용 할 수 있 습 니 다.
    instance Functor Maybe where  
        fmap f (Just x) = Just (f x)  
        fmap f Nothing = Nothing  
    
    ghci>fmap (+1) (Just 3)
    Just 4
    ghci>fmap (+1) Nothing
    Nothing
    

    여기 서 우 리 는 Functor 의 역할 을 알 수 있 습 니 다. 만약 에 하나의 유형 이 Maybe, List 와 구체 적 인 유형, 예 를 들 어 Int, Float 등 으로 구성 된다 면 이 유형 구조 부 를 Functor 의 인 스 턴 스 로 하여 하나의 함수 가 이 유형 에 작용 할 때 유형의 값 이 어떻게 변화 하 는 지 정의 할 수 있 습 니 다.
    6.2 Applicative Functor
    6.2.1 Applicative Functor 기본 개념
    Applicative Functor 가 뭐 예요?말 그대로 Functor 이 고 더 강 한 Functor 입 니 다.Appllicative 의 정 의 는 Control. Appllicative 에 있 습 니 다.
    class (Functor f) => Applicative f where  
        pure :: a -> f a  
        () :: f (a -> b) -> f a -> f b  
    

    정 의 를 통 해 알 수 있 듯 이 Applicative 는 하나의 유형 클래스 (type class) 이다. 즉, 하나의 유형 이 Appllicative 의 인 스 턴 스 라면 우 리 는 이 유형 을 Applicative 로 예화 할 때 이 유형의 행동 방식 을 정의 할 수 있다.이러한 행위 방식 의 정 의 는 바로 Pure 와 실현 이다.Functor 에서 fmap 에 대한 실현 처럼또한 정의 에는 실례 화 된 f 가 먼저 Functor 의 실례 가 되 어야 하 는 유형 제한 이 하나 더 있다.Pure 는 하나의 값 을 받 고 Applicative 값 을 되 돌려 줍 니 다. 예 를 들 어 Int 형식의 값 을 받 고 Maybe Int 형식의 값 을 되 돌려 줍 니 다.하나의 functor 값, 즉 f (a - > b) 을 받 고 하나의 functor 값 을 받 은 다음 첫 번 째 functor 에서 함 수 를 추출 하여 두 번 째 functor 의 값 에 작용 하여 마지막 으로 다른 functor 를 얻 습 니 다.지금 은 퓨 어 와 기본 개념 을 대충 알 고 나중에 만 나 는 예 가 많아 지면 자 연 스 럽 게 이해 할 수 있 습 니 다.
    6.2.2 Applicative Functor 실례 -- 어쩌면
    먼저 Maybe 가 Applicative Functor 로 서 의 정 의 를 보십시오.
    instance Applicative Maybe where  
        pure = Just  
        Nothing  _ = Nothing  
        (Just f)  something = fmap f something  
    

    예 를 들 어 퓨 어 와 무엇 을 하 는 지 이해 할 수 있 고 메 이 비 는 왜 Functor 의 인 스 턴 스 가 필요 한 지 이해 할 수 있 습 니 다.pure = Just 는 무엇 을 설명 합 니까?Pure 3 = Just 3, Pure 유형 정 의 를 보 세 요. a - > f a, 여기 a 는 Int, f 는 Maybe 입 니 다.Pure 는 일반 값 에서 Applicative 값 으로 전환 하 는 방법 을 정의 합 니 다.정의 에 fmap 가 나 타 났 습 니 다. fmap 의 정 의 를 회상 하면 그 역할 에 대해 많이 알 수 있 습 니 다.
    class Functor f where  
        fmap :: (a -> b) -> f a -> f b  
    

    예 를 들 어, (Just f) (Just a) = fmap f (Just a) = (Just (f a))
    ghci>(Just (+1))  (Just 3)
    Just 4
    ghci>fmap (+1) (Just 3)
    Just 4
    

    또한 Pure = Just 로 인해 다음 과 같은 형식 으로 쓸 수 있 습 니 다.
    ghci>(pure (+1))  (Just 3)
    Just 4
    

    6.2.3 어 플 리 케 이 티 브 스타일
    그리고 우 리 는 이렇게 놀 수도 있다.
    ghci>pure (+)  Just 1  Just 3
    Just 4
    ghci>pure (+)  Just 1  Nothing
    Nothing
    ghci>pure (+)  Nothing  Just 3
    Nothing
    

    이 건 또 무슨 뜻 이 죠?아래 의 유도 과정 에서 마지막 결과 가 어떻게 나 왔 는 지 알 수 있다.
    pure (+)  Just 1  Just 3
    = Just (+)  Just 1  Just 3 
    = (Just (+)  Just 1)  Just 3 
    = (fmap (+) Just 1)  Just 3
    = Just (+1)  Just 3
    = fmap (+1) Just 3
    = Just fmap (+1) 3
    = Just 4
    

    6.3 Monad
    6.3.1 Monad 의 기본 개념
    Monad 는 Functor, Applicative 처럼 유형 류 (type class) 이기 도 합 니 다. 그러면 어떻게 정의 합 니까?
    class Monad m where  
        return :: a -> m a  
    
        (>>=) :: m a -> (a -> m b) -> m b  
    
        (>>) :: m a -> m b -> m b  
        x >> y = x >>= \_ -> y  
    
        fail :: String -> m a  
        fail msg = error msg  
    

    또한 Functor, Applicative 처럼 Monad 의 인 스 턴 스 가 되 려 면 인 스 턴 스 의 일부 행 위 를 결정 하기 위해 함 수 를 정의 해 야 합 니 다.첫 번 째 함 수 는 return 입 니 다. C, C +, 자바 등 언어 에서 return 과 다 릅 니 다. 여기 서 return 은 Applicative 의 Pure 와 마찬가지 로 일반 값 을 monad 값 으로 바 꾸 었 습 니 다. 예 를 들 어 5 를 Just 5 로 바 꾸 었 습 니 다.두 번 째 함 수 는 (> =) 입 니 다. 유형 을 보면 매우 이상 한 함수 입 니 다.첫 번 째 매개 변 수 는 하나의 monad 값 이 고 두 번 째 매개 변 수 는 하나의 함수 입 니 다. monad 값 에서 하나의 값 을 추출 하여 이 값 을 함수 (두 번 째 매개 변수) 의 매개 변수 로 하고 마지막 으로 다른 monad 값 을 얻 습 니 다.
    6.3.2 Monad 실례 -- Maybe
    먼저 정 의 를 보십시오.
    instance Monad Maybe where  
        return x = Just x  
        Nothing >>= f = Nothing  
        Just x >>= f  = f x  
        fail _ = Nothing  
    

    return 의 정의 방식 은 Maybe 가 Applicative 인 스 턴 스 일 때 Pure 의 정의 방식 과 같 습 니 다. > =방금 말 한 바 와 같이 Just x 에서 x 를 추출 하여 f 의 매개 변수 로 합 니 다.이것 은 Monad 의 간단 한 개념 일 뿐 Monad 는 Haskell 에서 많은 응용 이 있 기 때문에 실제 에서 응용 해 야 한다.

    좋은 웹페이지 즐겨찾기