함수형 프로그래밍은 기존에 프로그래머들이 알고 있는 지식을 리팩터링하는 역할을 한다. 위에 그림처럼 가득 쌓여있는 프로그래밍 지식 더미 위에 함수형 프로그래밍이라는 계층을 하나 추가하면
프로그래밍 관점에서 '순수 함수(pure function)' 란 무엇일까?? 함수 내에서 발생하는 부수효과(side effect)가 없는 함수를 의미한다. 사이드 이펙트, 부수 효과는 다음과 같은걸 말한다.
함수형 프로그래밍은 또 하나의 약속을 제시한다. 변수를 언제나 '불변하게(immutable)' 관리하자고 말이다. '불변하다(immutable)' 라는 말은 어떤 변수에 한번 값을 할당하고 나면 어떤 방법으로도 해당 변수의 값을 바꿀 수 없게 만들자는 것이다.
그러면 리스트 a 는 처음 그대로 1,2,3,4 가 들어있다 append 결과인 1,2,3,4,5 리스트도 올바르게 결과값으로 얻을 수 있다.
방어적 복사는 간단하다. 위험한 함수, 즉 순수하지 않은 함수(impure funtion)을 호출하기 전에 전달하는 파라미터를 우선 복제한다. 그리고 이 복제본은 함수 호출 시 아규먼트로 사용한다.
이제는 실제 코드 예시를 리팩터링하는 과정을 직접 보면서 함수형 프로그래밍의 원리를 어떻게 코드에 적용하는지 살펴보자.
이런 고차함수, 일급객체 라는 특성을 활용하면 함수형 프로그래밍의 원리를 따르는 코드는 프로그래머에게 레고 블럭 놀이를 하는 것 같은 인상을 준다. 전체 프로그램을 완성하기 위해서 작은 단위의 함수를 모아서 사용하고
함수형 프로그래밍의 약속과 원리를 충분히 따르면서 작성한 프로그램의 전체 구조는 멀리서 보았을때 이런식으로 파이프라인 구조가 된다.
모든 순수 함수는 언제나 Lookup Table 로 치환해서 생각할 수 있다. 어떤 함수가 순수 함수인지 아닌지를 판단하는 기준은 함수의 입력값, 출력값 쌍을 Lookup Table 로 표현할 수 있는지 없는지가 된다.
함수형 프로그래머의 눈에는 세상 모든 변수, 세상 모든 함수가 Normal World 와 Wrapper World 둘 중에 하나에 속한 것으로 보인다. 여기서 Wrapper World 는 Side-Effect World 를 의미하는 것으로 함수형 프로그래밍에서는 모든
타입(type)이란 무엇일까? 타입은 어떤 것들의 집합(a set of things)에 이름을 붙이는 것이다. 집합이라고 하면 하나의 집합에 속한 요소끼리는 서로 공통된 속성을 공유하고 있으므로 각각의 요소가 동작하는 방식이나 해당 집합에 속한 요소에 접근하는 방식이
앞에서 split, parse, divide 함수의 타입이 딱딱 맞아떨어질 때는 세 개의 함수를 합성해서 하나의 함수인 것처럼 깔끔하게 한 줄로 만들 수 있었다. 그러나 지금은 그런 깔끔한 처리가 불가능하다.
함수형 프로그래밍에서는 bind, >=>(kleisli arrow), flatMap 세 가지가 모두 동일한 개념을 가리킨다. 이런식으로 함수형 프로그래밍의 원리를 적절하게 적용하면 각자가 다루는 코드베이스를 개선할 수 있다.
이를 통해서 코드는 처음 시작할때만 Normal World 에서 Wrapper World 로 진입한 후 중간 과정에서는 내내 Wrapper World 에 머무르는 코드가 되었다.
함수형 프로그래밍 원리의 핵심은 두 가지만 기억하면 된다. [함수의 순수성 보장하기], [변수의 불변성 보장하기] 이 글을 읽는 분들이 색다른 관점을 통해서 새로운 통찰력을 얻어가는 유익한 시간이 되었으면 좋겠다.