FP(Functional Programming) - 수학적 구조와 모나드

cfop·2020년 10월 29일
2

모나드에 대해서 "모나드는 endofunctor입니다" 하고 스리슬쩍 넘어갔었는데, 그 부분에 대해서 자세히 얘기해보려 합니다.

수학적 대상은 무엇일까

수학적 대상은 우리가 수학적인 생각을 하면 마주치는 모든 것 입니다.
수, 수열, 행렬, 집합, 점, 선, 삼각형, 군, 환, 체, 카테고리 등등입니다.
(이렇게 쓰고 보니 수학과 관련된 모든것이네요.)

알아두면 좋은 것

몰라도 상관없지만, 알면 좋은 개념 입니다.(저도 잘 모릅니다..)

반군(semi group)

단군(monoid)


반군 -> 단군 -> 군 순서대로 개념과 조건이 확장되네요!

닫혀 있다는 것의 의미

어떤 연산에 대한 결과가 자기 자신의 집합에 포함된다는 의미 입니다.

연산

대수학에서는 집합 내의 원소 두개를 가지고 연산하는 이항 연산에 초점을 맞추고 있습니다. 우리가 익히 아는 덧셈, 뺄셈, 곱셈, 나눗셈 뿐 아니라 어떤 규칙을 만들어 그것을 H 연산이라고 정의 할 수도 있습니다. 어떤 연산이든 닫혀 있는가 닫혀 있지 않는가가 더 중요하다고 볼 수 있습니다.

카테고리(범주)

범주는 더 큰 개념 을 다룹니다. 수학적 대상(위에 설명이 있습니다)의 모음 입니다.
이하 카테고리라고 하겠습니다.

카테고리의 정의


이미지가 작아서 다시 정리 해보겠습니다.

  • 범주는 대상의 모음입니다.
  • 이 카테고리안에 대상 A, B에 대하여 A를 정의역으로, B를 공역으로 하는 사상(morphism)이 존재 합니다.
  • 사상은 합성 가능 합니다.
    • 고급지게 표현하면

      해당 사상을 수행하는 모든 사상의 집합의 카르테시안 곱
  • 자기 자신으로 가는 항등 사상이 존재 합니다.
  • 사상의 결합 법칙은 함수 합성의 결합법칙 임니다. 이를 보장 합니다.
  • 항등 사상이 있습니다.

사상(morphism)

함수 입니다. 정의역에서 공역으로 변환 합니다.
f : 실수 -> 자연수 [실수 집합의 어떤 원소를 자연수의 어떤 원소로 mapping 하는 함수]

어떤 함수가 2.5라는 값을 2로 변환 시킬 때 수학에서는 값에 집중하지 않고 이 함수는
실수 집합에서 자연수 집합으로 매핑시킨다는 점에 집중 합니다.

프로그래밍 입장에서 생각 해보면, 함수라는건 타입의 변화 입니다

f: number -> string [숫자 집합의 어떤 값을 문자 집합의 어떤 값으로 mapping]
타입은 곧 집합 입니다. 해당 변수에 대입되는 것은 그 집합의 원소임을 뜻하게 되기 때문 입니다.

함자(functor)


위에서 연산은 집합 내의 두 원소를 갖고 연산한 결과가 집합 내에 포함 되었는가, 아닌가를 따졌다면 함자는 범주끼리 대응 시킵니다.
원소는 어떤 카테고리가 되고, 연산이 함자가 되었다고 확장해서 생각하면 됩니다.

수학적 대상 -> 카테고리
연산 -> functor
원소 -> 수학적 대상

한 차원씩 높아진 느낌 입니다.

F: C -> D 라고 한다면 어떤 범주 C는 F를 통해 다른 범주 D로 대응이 됩니다.

  • functor 역시 항등사상이 있습니다.
  • functor 역시 합성을 보존 합니다.(f: X -> Y, g: Y -> Z : F(g * f) = F(g) * F(f))
    (함수 합성은 오른쪽부터 진행 됩니다)
    함자에 들어가는 인수는 함수네요!

endofunctor : 모나드

endofunctor는 자기 자신의 카테고리로 가는 사상 입니다. 이를 모나드라고 한다고 하네요

Maybe.map(() =>{...}) -> Maybe 
Maybe 카레고리의 map functor는 Maybe이므로 Maybe는 모나드 입니다.

[].map(()=>{...}) -> []
Array 카레고리의 map functor는 Array이므로 Array는 모나드 입니다.

Promise.then(()=>{...}) -> Promise
Promise 카레고리의 then functor는 Promise이므로 Promise는 모나드 입니다.

모나드 라는 것이 어떤 특정한 무기 이름은 아닙니다. 굉장히 포괄적으로 적용 할 수 있습니다.

  • 카테고리에 대해 항등 사상이 존재한다
  • 사상은 합성(결합법칙)을 만족한다

가 전부 입니다.

카테고리는 결국 모든것

위에서 봣듯이 우리가 알게 모르게 이미 모나드를 십분 활용하고 있었습니다.
우리가 결국 생각해야 할 것은 어떤 카테고리에서 어떤 카테고리로 사상 되는가?
나 어떤 집합에서 어떤 집합으로 사상되는가? 에 대해 주안점을 맞춰야 합니다.
그것이 작성된 프로그램의 안정성을 보장 합니다.
이런 개념을 차용하여 함수형 프로그래밍이라는 패러다임을 창제(?) 하게 됩니다.

다음 글에서는 오늘 작성한 글을 기반으로

  • 함수에 대하여
  • 함수의 합성
  • monad 파헤치기
  • 이걸 도대체 어디다 써먹을 수 있는지 심층분석

에 대해 다뤄 보겠습니다.

저도 공부 하면서 적은것이라 오류는 있을 수 있습니다. 피드백은 언제나 환영 합니다(ㅜㅜ)

읽어주셔서 감사 합니다.

profile
dog발자

0개의 댓글