2022. 10. 31. 00:00ㆍFunctional Programming/Category Theory
참고 : https://bartoszmilewski.com/2015/01/20/functors/
functor는 두 범주 간의 매핑이다.
펑터는 객체뿐만 아니라 객체 간의 기능(모피즘이라고 함)도 매핑한다.
예를 들어, 펑터 F는 카테고리 C와 D 사이의 매핑일 수 있다.
f :: a -> b
F f :: F a -> F b
위 코드를 그림으로 표현하면 아래와 같다.
functor는 카테고리들 사이의 맵핑이기 때문에,
functor는 항등과 합성을 지원해야 한다.
이 두가지는 functor의 법칙으로 알려져 있다.
합성을 지원하는 예)
h = g . f
F h = F g . F f
이것도 그림으로 표현하면...
항등을 지원하는 예)
즉 functor 는 범주의 구조를 유지해야 한다.
Category 에서 자기자신으로 mapping 되는 functor 를 endofunctor 라고 한다.
그중 하나의 예는 다음과 같다.
Maybe Functor
Maybe 의 정의는 아무것도 없거나 그 자신인 값이다.
Haskell 에서 다음과 같이 표현할 수 있다.
data Maybe a = Nothing | Just a
자 이것을 가지고 Maybe functor 를 만들수 있을까?
아래와 같은 함수가 있다고 가정해보자
f :: a -> b
이것을 기준으로 Maybe a -> Maybe b 로 가는 함수를 만들고 싶다.
자 다음과 같은 형태일 것이다.
f’ :: Maybe a -> Maybe b
f’ Nothing = Nothing
f’ (Just x) = Just (f x)
Nothing 은 어차피 nothing 일테고
x 는 f(x) 형태일테니 위와 같이 표현할 수 있다.
Haskell 에서는 fmap 이 f 에대한 functor mapping 을 구현한다.
fmap :: (a -> b) -> (Maybe a -> Maybe b)
function 에서 map 은 composition 이라고 이해하면 된다.
Container (List,Dictionary .... etc)
Value (Container 에 넣어지는 실제 Type .. int, bool, or custom class)
Transform (어떤 값 T 를 U 로 변환해 주는 function)
Container + Value + Transform == Functor
(List, <T>, Select) == Functor
List<int>.Select(x=>x+2) == Functor
관련영상
'Functional Programming > Category Theory' 카테고리의 다른 글
Contravariant Functor, Profunctor (0) | 2022.11.14 |
---|---|
ApplicativeFunctor, BiFunctor (0) | 2022.11.07 |
Product and CoProduct (0) | 2022.10.24 |
Kleisli Catogories (0) | 2022.10.17 |
Monoid as Category (0) | 2022.10.10 |