f = \x -> x + 1
g = \x -> 2 * x

에대해

f . g를 계산했다고 해봅시다.

먼저, f와 g 데이터 각각은 코드영역의 데이터일 것입니다.

f 1, f 2, f3을 하더라도 모두 다 같은 코드쪼가리에 도달해서 절차를 밟을것입니다.(하스켈의 구현에 대한 이야기)


그러면 f . g는요?

f . g에 대한 데이터는 코드영역에 박혀있지 않습니다.

하스켈이 모든 고차함수 반환값들을 힙에 저장할까요?

사실 합성의 경우는 생각하기가 용이합니다.

. 이라는 연산이 인자로 전달받은 코드를 순차실행하고,
.이라는 연산자에 두개의 코드쪼가리에 대한 참조가 전달된다면 효과적으로 데이터를 표현할 수 있습니다.


커리잉을 생각해 보죠

a -> b -> b 에 a를 대입해서 반환된 b -> b 함수는 기존의 a -> b -> b 코드를 얼마만큼 재사용할까요?
적어도 기존의 a -> b -> b 코드에다가 a 데이터를 얹은 만큼의 데이터가 필요할 것입니다.
a -> b -> b 코드는 재활용한다고하면, 코드에 대한 참조와 a 데이터 만큼의 데이터가 필요하겠네요.




합성과 커리잉에 대해 "이렇게 코드쪼가리들을 참조하면 되겠다" 를 알아보았는데요,


이 모든 질문은 이런말로 다시생각해볼수 있습니다.


"연산을 할때마다 새로운 함수들이 새로 생성된다. 자바코드로 따지자면 소스코드가 복제되는 형식 아닌가?"


아 근데 사실 글을 쓰면서 실제 예시를 다뤄보고 나니 깨달았습니다.

코드복제는 없겠네요.

추상화시켜서 a -> b -> b 라고 하면 결괏값이 함순데?

싶지만 함수가 함수를 반환하게 되는 실제 과정을 살펴보면 다 합성과 커리잉의 연장선 아닐까 싶습니다.