SPAUPA
2024. 6. 16. 06:58

최근에 유튭 시리즈 'Category Theory for Programmers'를 본 적이 있습니다. 사실 그 전에도 이 시리즈의 도서 버전도 읽어보려 했습니다만⋯ 꽤나 장황해서 잊고 있었죠. 하지만 영상으로 — 특히 강의로 — 보니 꽤나 재미있는 분야라는 걸 알게 되었습니다.

여느 프로그래머가 그렇듯, 범주론을 처음 알게된 것은 모나드함수형 프로그래밍을 통해서였습니다. 함수형 프로그래밍은 그렇다고 칩시다. 함수형 프로그래밍에 적합한 언어들이 많이 개발되고 사용 중인 추세니까요.(Gleam, JS/TS 등)^1

근데 모나드는 너무나 기묘한 존재였습니다. 함수형 프로그래밍 언어의 결정체가 바로 Haskell이라는데, 아니 거기서 모나드라는 걸 쓴대! 근데 그게 뭔지 알아? 바로

A monad (⋯) is a monoid in the category of endofunctors of some fixed category.
(모나드는 일부 Fixed Category의 Endofunctor들의 Category 안의 Monoid이다.)

Wikipedia

⋯네?


알고보니, 모나드는 범주론(Category Theory)이라는 수학의 한 분야에서 사용되는 용어라고 합니다. 범주론이 무엇이냐 하면은⋯ 한마디로 표현해보자면 추상화의 끝판왕이라 할 수 있겠습니다. (절대 저는 이런 말을 할 정도로 수학을 충분히 통달한 사람이 아닙니다. 평생 감자만 먹고 산 사람이 '감자가 이 세상 최고의 음식이다!'하고 꽥꽥대는 것처럼 들어주십시오.)

추상화를 간단히 설명하자면, '다양한 것을 같은 것으로 묶는 것'이라 할 수 있겠습니다. 신라면, 진라면, 참깨라면은 컵라면으로 추상화 할 수 있죠. 갤럭시와 아이폰은 스마트폰으로 추상화 할 수 있구요. 범주론은 여기서 극한의 추상화를 보여줍니다: 모든 물체, 개념들을 하나의 점으로 표현하죠.

이는 라면이나 스마트폰도 포함되지만, 보통 이러한 '점'으로 표현되는 것들은 집합, 함수, 군(Group)과 같은 수학적 개념입니다. 범주론에선 이를 Object라고 부릅니다. (지금 글을 쓰는 중인데요, 혹시 범주론 용어가 너무 많으면 전부 번역해야할 수도 있겠습니다. 허나 이 괄호가 남아있다면 제가 포기한 것이니 안심하고 '허나참'을 외쳐주시기 바랍니다.)

그리고 Object들 사이에는 어떤 관계가 있습니다. 이를 Morphism이라고 합니다. 예를 들어, 두 라면 중 무엇이 더 맛있는지 나타내는 Morphism을 생각해봅시다. 진매는 진순보다 맛있습니다, 자명한 사실이죠. 그럼 진순 -> 진매의 모양으로 화살표, 즉 Morphism을 그리는 겁니다. 이러한 작업을 모든 라면에 하게 되면 Morphism들이 거미줄처럼 얽히고설키게 되겠죠? (라면 사이의 Total Order가 되겠네요.)


(출: Wikipedia)

이러한 Object와 Morphism의 모임^2 중, 특정한 조건을 만족하면 범주(Category)가 됩니다. 근데 여기선 그 규칙에 대한 설명은 생략하겠습니다. 검색하세요. 여하튼 제가 말하고 싶었던 건, 범주론은 이러한 Object와 Morphism을 다루는 학문이라는 겁니다.


이게요, 제 머릿속을 박박 긁는 것 같습니다 요즘. 안 좋은 의미가 아니라, 마치 등 뒤에 간지러운 부분을 정확히 한 번에 찾아내서 긁어주는 느낌이란 거죠. 진짜 정말 찰지게 긁습니다.

유용하다는 게 아닙니다. 그냥 정말 너무 흥미로워요.

Object와 Morphism의 정의만 들었을 땐 범주론이 정말 간단한 학문일 것이라고 느끼기 쉽습니다. 그렇지 않은 게 신기할 정도죠. 하지만 여러분이 범주론에 대한 자료를 읽으며 직접 배워보게 되면 그 범주론의 주인공인 Category(범주)와 그걸 이루는 Object, Morphism, 그리고 그걸로 만들어지는 Functor니 뭐니 Natural Transform, Limits, Products and Coporoducts, 그리ㄱ로 을ㄷㅈㄼ릉늚늠른ㅇ 아주 별별 요상한 개념들로 짐볼 위에서 서커스마냥 6단 저글링을 하는 내용을 읽으며 기가 차서 '허나참'을 외치시게 될 겁니다.

Object를 다른 Object와 이어주는 게 뭘까요? Morphism이죠?

Object와 Morphism이 모이면? Category(범주)죠?

근데 Category를 다른 Category에 이어주면? 그건 Functor라고 한답니다.

여기서 그 Functor의 시작과 끝이 같다면? 그건 Endofunctor랩니다.

그럼 Morphism의 시작과 끝이 같다면? Endomorphism! (이건 저도 글 쓰면서 알았네요)

그렇게 Object 하나와 Endomorphism들로 ^3 이루어진 Category는? Monoid!

자 그럼 Monad(모나드)는 뭐다? Endofunctor*들의 *Category 안의 Monoid이다! (Wikipedia)

와! 제가 필요한 걸 거의 다 설명한 것 같으니, 여러분은 이제 Monad의 정의를 이해할 수 있어야 합니다!

허나참.


그래도 이런 점이 참 재미있습니다. 제 이해력의 한계를 테스트하는 것 같거든요. Product나 Limit과 같은 다소 정의를 이해하기 어려운 개념들은 머리 속이나 노트 위에 도표(Diagram)를 그려가며 이해해야 했습니다. 범주론의 특징적인 추상화의 강도가 이러한 개념들을 이해하는 걸 참 어렵게 하는 것 같습니다. Object와 Morphism엔 정말 뭐든지, 뭐든지 들어갈 수 있으니까요. 신비롭지 않나요?

한편 뜬구름 잡는 소리처럼 들리는 이 범주론도 실제로 큰 도움이 된다고 합니다. 범주론의 추상화는 다양한 수학 분야들을 하나로 묶어주어 판단할 수 있게 합니다. 수학의 분야들을 추상화 하는 거죠. 이를 통해 위상수학에서 사용되는 풀이를 군론(Group Theory)에서 사용하는 것 등의 활용이 가능하다고 합니다.

또한 함수형 프로그래밍의 발전과 (어느 정도의) 대중화로 범주론이 (어느 정도) 큰 주목을 받기 시작하고 있죠. (아님 나만 함수형 프로그래밍을 좋아하는 걸지도) 모나드가 그 한 예시죠. 모나드를 활용하면 여러 함수를 합성하여 실행하는 것을 더 '유연하게' 만들어 줄 수 있죠.

사실 이 포스트에는 모나드의 안 좋은 설명만 그득합니다. 나무위키가 훨씬 더 잘 설명을 잘 해주네요.


별 특이한 걸 즐기고 합니다 이렇게. 여러분도 기회가 되면 한번 배워보세요. 저도 지금 관련 E-Book을 읽으며 배워가고 있습니다. 근데 영어가 안 되면 좀 힘들 수도.


1) 물론 그렇지 않은 언어도 있죠. 아직도 마크 모드 개발을 배울 때 알게된 자바의 (인터페이스 = 익명메서드) 논리는 잊혀지지가 않습니다. 이게 악하다거나 한 건 아닌데, '정말 이렇게까지 해야하나?' 싶더라구요. Java 8이 출시되며 해결되었지만요.
2) 이걸 집합이라고 부르진 않는답니다. 러셀이 쏘아올린 작은 공때문이라네요.
3) 여기서 ''은 생략된 규칙을 의미합니다.

'생각' 카테고리의 다른 글

블로그 포스트는 내 생각을 그대로 적으며 만들 것  (1) 2024.06.10