함수형 프로그래밍
어떻게 문제를 해결할지 보다 무엇을 해결할지에 초점을 맞춘 declarative type of programming이다. Clojure, Common Lisp, Erlang, Haskell, Scala가 유명한 functional programming language이다. 프로그래밍 패러다임은 lambda calculus에 기반한다.
Lambda Calculus
statement 대신 expression을 사용한다. 값을 할당하기 위해 실행되는 statement와 달리, expression의 evaluation은 값을 생성한다. Lambda calculus는 거의 모든 함수형 언어의 기본을 형성한다. 함수와 그것의 evaluation을 묘사하는 이론적인 프레임워크를 말한다.
5가지 중요한 concept
1.Pure Functions
- 같은 argument에 대해서 항상 같은 output을 생성한다. 이 성질을 immutability라 부른다.
- side-effect가 없다. (side effect : 외부의 상태를 변경, 예상치 못한 에러 발생)
pure function은 side-effect가 없고 숨겨진 I/O가 없기 때문에, functional paradigm을 사용하여 만들어진 프로그램들은 디버깅하기 쉽다. 게다가, 병렬 어플리케이션을 작성하기가 더 쉽다.
코드가 functional programming style로 작성되면, 컴파일러는 다음을 할수 있다.
- 결과를 저장
- instruction을 병렬로 실행
- lazy evaluation
2. Stateless, Immutability
입력받은 객체의 상태값을 변경할 수 없고, 새로운 객체를 반환해야 한다.
3. Expression only
for,while,if,switch를 사용하지 않고 map,filter와 같은 expression만 사용해야함.
4. Referential Transparency
함수의 호출을 그 함수의 리턴값으로 대체할 수 있으면, 이를 referentially transparent 하다고 부른다. 이를 실현하기 위해서 함수는 pure해야 하고, side effect가 없어야 한다.
5. Recursion
functional programming 패러다임에서는 for, while loop이 없다. 대신에 functional programming은 반복을 위해서 recursion에 의존한다.
6. Functions are First-Class and can be Higher-Order
함수형 프로그래밍 스타일에서 함수는 변수로 간주된다. 따라서, first-class function이다. 이 first-class function들은 다른 함수에 파라미터로 전달되거나 리턴되거나 다른 자료구조에 저장될수 있다.
higher-order function이란 다른 함수를 인자로 받아서 함수를 리턴하는 함수를 말한다.
함수형 프로그래밍의 장단점
장점
- pure function 성질 때문에 함수 밖에서 변수를 바꿀수 없고, 병렬 프로그래밍하기 쉬워진다.
- lazy evaluation을 지원하는데, value는 오직 필요할때만 저장되거나 계산된다. 작업이 최적화 될 수 있다.
- argument를 읽어서 immutable 결과를 생성하기때문에 debugging, testing이 쉬워진다.
단점
- recursion을 사용해서 반복작업을 수행하면 퍼포먼스가 낮아질수 있다.
- 몇몇 경우에는 가독성이 떨어질수 있다.
출처
https://hackr.io/blog/functional-programming
https://en.wikipedia.org/wiki/Side_effect_(computer_science)