"학습 총화 - Haskell - 6" Haskell 중요 프로 그래 밍 모델 - Functor, Applicative, Monad
15050 단어 프로 그래 밍 언어Haskell
Table of Contents
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 에서 많은 응용 이 있 기 때문에 실제 에서 응용 해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
셸 스 크 립 트 프로 그래 밍: sed 명령 으로 텍스트 편집red 는 온라인 편집기 의 일종 이다.그것 은 한 줄 의 내용 을 한꺼번에 처리한다.작업 중 에 한 고객 의 요 구 를 만 났 습 니 다. 기본 와 이 파이 의 ssid 이름 은 MAC 주소 의 뒷 6 자 리 를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.