모나드에 대해서 "모나드는 endofunctor입니다" 하고 스리슬쩍 넘어갔었는데, 그 부분에 대해서 자세히 얘기해보려 합니다.
수학적 대상은 우리가 수학적인 생각을 하면 마주치는 모든 것 입니다.
수, 수열, 행렬, 집합, 점, 선, 삼각형, 군, 환, 체, 카테고리 등등입니다.
(이렇게 쓰고 보니 수학과 관련된 모든것이네요.)
몰라도 상관없지만, 알면 좋은 개념 입니다.(저도 잘 모릅니다..)
반군 -> 단군 -> 군 순서대로 개념과 조건이 확장되네요!
어떤 연산에 대한 결과가 자기 자신의 집합에 포함된다는 의미 입니다.
대수학에서는 집합 내의 원소 두개를 가지고 연산하는 이항 연산에 초점을 맞추고 있습니다. 우리가 익히 아는 덧셈, 뺄셈, 곱셈, 나눗셈 뿐 아니라 어떤 규칙을 만들어 그것을 H 연산이라고 정의 할 수도 있습니다. 어떤 연산이든 닫혀 있는가 닫혀 있지 않는가가 더 중요하다고 볼 수 있습니다.
범주는 더 큰 개념 을 다룹니다. 수학적 대상(위에 설명이 있습니다)의 모음 입니다.
이하 카테고리라고 하겠습니다.
이미지가 작아서 다시 정리 해보겠습니다.
함수 입니다. 정의역에서 공역으로 변환 합니다.
f : 실수 -> 자연수 [실수 집합의 어떤 원소를 자연수의 어떤 원소로 mapping 하는 함수]
어떤 함수가 2.5라는 값을 2로 변환 시킬 때 수학에서는 값에 집중하지 않고 이 함수는
실수 집합에서 자연수 집합으로 매핑시킨다는 점에 집중 합니다.
프로그래밍 입장에서 생각 해보면, 함수라는건 타입의 변화 입니다
f: number -> string [숫자 집합의 어떤 값을 문자 집합의 어떤 값으로 mapping]
타입은 곧 집합 입니다. 해당 변수에 대입되는 것은 그 집합의 원소임을 뜻하게 되기 때문 입니다.
위에서 연산은 집합 내의 두 원소를 갖고 연산한 결과가 집합 내에 포함 되었는가, 아닌가를 따졌다면 함자는 범주끼리 대응 시킵니다.
원소는 어떤 카테고리가 되고, 연산이 함자가 되었다고 확장해서 생각하면 됩니다.
수학적 대상 -> 카테고리
연산 -> functor
원소 -> 수학적 대상
한 차원씩 높아진 느낌 입니다.
F: C -> D 라고 한다면 어떤 범주 C는 F를 통해 다른 범주 D로 대응이 됩니다.
endofunctor는 자기 자신의 카테고리로 가는 사상 입니다. 이를 모나드라고 한다고 하네요
Maybe.map(() =>{...}) -> Maybe
Maybe 카레고리의 map functor는 Maybe이므로 Maybe는 모나드 입니다.
[].map(()=>{...}) -> []
Array 카레고리의 map functor는 Array이므로 Array는 모나드 입니다.
Promise.then(()=>{...}) -> Promise
Promise 카레고리의 then functor는 Promise이므로 Promise는 모나드 입니다.
모나드 라는 것이 어떤 특정한 무기 이름은 아닙니다. 굉장히 포괄적으로 적용 할 수 있습니다.
가 전부 입니다.
위에서 봣듯이 우리가 알게 모르게 이미 모나드를 십분 활용하고 있었습니다.
우리가 결국 생각해야 할 것은 어떤 카테고리에서 어떤 카테고리로 사상 되는가?
나 어떤 집합에서 어떤 집합으로 사상되는가? 에 대해 주안점을 맞춰야 합니다.
그것이 작성된 프로그램의 안정성을 보장 합니다.
이런 개념을 차용하여 함수형 프로그래밍이라는 패러다임을 창제(?) 하게 됩니다.
다음 글에서는 오늘 작성한 글을 기반으로
에 대해 다뤄 보겠습니다.
저도 공부 하면서 적은것이라 오류는 있을 수 있습니다. 피드백은 언제나 환영 합니다(ㅜㅜ)
읽어주셔서 감사 합니다.