Functor

2022. 10. 31. 00:00Functional 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  

 

관련영상

https://youtu.be/d8UYj7f633U

 

 

 

반응형

'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