※스칼라로 배우는 함수형 프로그래밍(폴 키우사노, 루나르 비아르드나손) 책 공부내용 정리
* 순수 함수란?
: 부수 효과(side effect)가 없는 함수.
수학에서 함수를 f(x)=ax+b 등 로 표현하는 것처럼 똑같은 입력 값에 대해 항상 같은 값을 돌려주는 것 외에 다른 기능(변수 값을 갱신한다던지, 자료 구조를 변경한다던지)은 하지 않아야 한다.
이런 개념을 참조 투명성(referential transparency, RT)라는 개념으로 설명할 수 있다.
* 참조 투명성(referential transparency, RT)
: 모든 프로그램에 대해 어떤 표현식(expression) e를 모두 그 표현식의 결과로 치환해도 프로그램에 아무 영향이 없다면 그 표현식 e는 참조에 투명하다(referentially transparent). 만약 어떤 함수 f(x)가모든 입력값 x에 대해 참조에 투명하면 그 함수 f는 순수하다.
참조에 투명한 예제)
> val x = "Hello"
> val r1 = x + " World"
> val r2 = "Hello" + " World"
> val r3 = x + " World"
위 문장을 순서대로 수행한다고 생각하자. x를 "Hello"를 리턴하는 함수라고 생각하면, r1, r2, r3 모두 그 결과값은 같다. 즉 함수 x를 그 함수의 리턴 값인 "Hello" 치환해도 프로그램에 문제가 없다.
참조에 투명하지 않은 예제)
> val x = new StringBuilder("Hello")
> val r1 = x.append(" World").toString
> val r2 = x.append(" World"),toString
역시 위 문장을 순서대로 수행한다고 생각하자. 함수 x의 리턴값은 new StringBuilder("Hello")이고 r1을 수행하면 결과값은 "Hello World"이다.
그런데 r2를 수행하면?
r1을 수행한 상태에서 함수 x의 상태값(?)은 변경되었으므로 r2의 수행결과는 "Hello World World"이다. x의 리턴값을 new StringBuilder("Hello")라고 한다면 r2에서 x를 이 값으로 치환했을 때 그 결과는 "Hello World"이므로 두 수행 결과는 다르다.
또한 함수는 같은 입력에 대해 항상 같은 값을 반환해야 하고, 함수를 그 함수의 결과값으로 치환해도 프로그램에 영향이 없어야 한다고 했는데 r1, r2에서 함수 x에 대해 각각 똑같은 입력 append(" World") 을 수행했지만 그 결과값은 서로 다르므로 x는 순수 함수가 아니다.
(아.......배운 내용 포스팅하는 거 되게 귀찮은 일이었구나...하지말까....블로거 분들 존경합니다ㅠㅠ)
'잡동 > etc' 카테고리의 다른 글
SOAP와 REST 간단한 개념정리 (0) | 2016.07.06 |
---|