함수형 프로그래밍이 뭐라고 얘기하면 될까, 아직도 완벽하게 아는 건 아닙니다만, 힌트가 될만한 생각이 떠올라 글로 남깁니다. 저는 하스켈만 사용해 봤으니, 하스켈 기준으로만 얘기하겠습니다.
순수 함수들로, 주로 배열을 인자로 받으며 Map, Fold를 쓰는 스타일로 설명합니다. 틀린 말은 아니지만, 뭔가 조금 더 얘기해야만 할 것 같은 설명입니다. 혹, 아직 함수형 프로그래밍을 공부하기 전이라면 쏙쏙 들어오는 함수형 코딩 - 에릭 노먼드 지음, 김은민 옮김 책이 볼만 합니다. 자바스크립트로 절차형 코드를 보여주고, 함수형으로 뜯어 고치는 걸 보여줍니다. 절차형에서 함수형으로 사고를 옮겨가는 시작점으로 꽤 적당해 보입니다.
하스켈은 람다 산법의 람다 추상abstraction과 너무 비슷합니다. 그냥 람다 산법형 프로그래밍이라고 해도 되지 않을까 정도로 비슷합니다. 하스켈을 공부하기 전에, 간단하게 람다 산법 초반 두 세 개 챕터를 보고, 용어와 개념을 익혀 둔다면, 하스켈 교재들을 읽는데 많은 도움이 됩니다.
비슷한 비슷한 대상이나 구조들의 관계(매핑)를 만들어 나가는 스타일. 가장 추상적인 설명이고, 함수형 프로그래밍이 뭔지 알고나서 들어야 이해할 수 있는 설명이라 생각합니다.
(저만의 상상입니다) 함수를 조립해서 프로그램을 완성하는데, 이 과정에서 조립되는 함수들 자체가 모노이드입니다. 여기 글은 주로 이 것과 관련된 글입니다.
스트림을 다루는 것으로 설명하곤 합니다. 데이터 흐름이 들어오면, Map
이나 Fold
함수들로 데이터를 변경해서, 다음 함수에 넘겨 준다고 말합니다. 그러다 보니, 변경되는 값에 촛점이 맞춰지는 경우가 있는데, 데이터를 바꾸는 함수들을 어떻게 조립할 것인가를 들여다 보면 함수형 프로그래밍이 보입니다.
1 + 1 + 1 ...
정수와 정수를 더하면 정수가 나옵니다. 대상 두 개에 연산을 적용하면 같은 타입의 대상이 나옵니다. 여기에 결합 법칙, 항등원을 만족하면 모노이드가 됩니다. 여기까지 얘기를 들으면, 대상과 대상의 조합이 같은 타입의 대상으로 결과가 나오는 게 중요해 보입니다. “그렇지, 대상이 같아야 결과에 또 다음 함수를 적용할 수 있지”하고 끄덕이게 됩니다. 하지만, 함수형 프로그래밍에서 입술이 부르트게 자주 나오는 모노이드는 같은 타입의 대상이 나오는 것보다는, 함수와 함수의 조합이 같은 타입의 함수가 나오는 것에 관한 얘기라고 보는 게 더 적당합니다.
말이 안되지만, 마치 다음과 비슷한 얘기입니다. (이항, 단항 연산으로 말이 안되지만, 무얼 얘기하는지 금방 눈에 들어 오는 것 같아 적어 두었습니다.)
1 ((+) ∘ (-) ∘ (*) ∘ (+) ∘ (*) ∘ ...) 1
(+)
와 (-)
함수를 ∘
으로 결합해도, 똑 같은 입출력을 가진 함수가 나오는 것에 관한 얘기입니다.
위 쏙쏙 책에서 자바스크립트 예시 하나를 가져왔습니다.