
프로그래밍 언어론
Applicative Functor적용 함자
적용 함자(Applicative Functor)는 함자(Functor)와 모나드(Monad) 사이에 위치하는 타입 클래스다. 컨텍스트 내부에 있는 함수를 같은 컨텍스트의 값에 적용할 수 있다.
정의
haskell
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
-- Applicative 법칙:
-- 항등: pure id <*> v = v
-- 합성: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
-- 준동형: pure f <*> pure x = pure (f x)
-- 교환: u <*> pure y = pure ($ y) <*> uFunctor < Applicative < Monad
haskell
-- Functor: 컨텍스트 외부의 함수 적용
fmap :: (a -> b) -> f a -> f b
-- Applicative: 컨텍스트 내부의 함수 적용
(<*>) :: f (a -> b) -> f a -> f b
-- Monad: 결과에 따라 다음 컴퓨테이션 결정
(>>=) :: f a -> (a -> f b) -> f b
-- 모나드로 Applicative 구현 가능:
-- f <*> x = f >>= (\g -> fmap g x)
-- 역방향은 일반적으로 불가Maybe Applicative
haskell
instance Applicative Maybe where
pure = Just
Nothing <*> _ = Nothing
_ <*> Nothing = Nothing
Just f <*> Just x = Just (f x)
-- 커링된 함수를 여러 Maybe에 적용
add :: Int -> Int -> Int
add = (+)
Just add <*> Just 3 <*> Just 5 -- Just 8
Just add <*> Nothing <*> Just 5 -- Nothing
-- 동일한 표현 (liftA2 사용)
liftA2 add (Just 3) (Just 5) -- Just 8실용 예시: 폼 검증
haskell
data ValidationError = EmptyName | InvalidEmail | ShortPassword
type Validation e a = Either [e] a
validateName :: String -> Validation ValidationError String
validateName "" = Left [EmptyName]
validateName n = Right n
validateEmail :: String -> Validation ValidationError String
validateEmail e
| '@' `elem` e = Right e
| otherwise = Left [InvalidEmail]
data User = User String String
-- 독립적 검증을 병렬로 수행 (모나드 불가, Applicative 가능)
validateUser name email =
User <$> validateName name
<*> validateEmail email
-- 모든 에러를 한 번에 수집!관련 개념
- •함자 (프로그래밍)
- •모나드
- •자유 모나드