Open leejaeseung opened 1 year ago
아래 내용은 이 글을 정리한 내용입니다.
g . h == k . f
라면
$map g . fmap h == fmap k . $map f
이다. ($map 은 타입 생성자 F 의 기본 map)
$map
map :: (a -> b) -> [a] -> [b]
기본식 1
fmap id == id
라면
fmap f == $map f
이다.
증명
fmap f
= {- by $map id = id -}
$map id . fmap f
= {- by free theorem, using g = k = id, h = f -}
fmap id . $map f
= {- by fmap id = id -}
$map f
기본식 2
f . g == id . (f . g)
가정 2
fmap id == id
라면
fmap f . fmap g == fmap (f . g)
이다.
증명
fmap f . fmap g
= {- by lemma 1, fmap f = $map f -}
$map f . fmap g
= {- by the free theorem for fmap using lemma 2 for the precondition -}
fmap id . $map (f . g)
= {- by fmap id = id -}
$map (f . g)
= {- by fmap _ = $map _ -}
fmap (f . g)
@leejaeseung ........ 쉽지 않네요...
연관 챕터
17
조사 내용
p.170 에 Functor 가 되기 위한 2 가지 조건이 나옵니다.
이는 다른 책에서 아래와 같이 설명합니다.
fmap(identity()) == identity()
즉, fmap 에 identity 를 적용한 것과 identity 가 같다.fmap(f * g) == fmap(f) * fmap(g)
즉, 개별적으로 합성한 것과 합성 후 fmap 한게 동일하다.여러 책들에서 위 두 가지 조건을 모두 만족하는 fmap 은 Functor 라고 정의할 수 있다고 합니다. 하지만 Functor 의 제 1 법칙을 만족한다면 제 2법칙은 항상 만족함을 증명한다는 글이 있어 정리해 봅니다.