SICP 연습문제 1.42 친절한 풀이

문제

f와 g가 모두 인자 하나를 받는 프로시저라 하자. g와 f의 합성함수는 xf(g(x))x\mapsto f(g(x))로 정의한다. 두 프로시저를 합성하는 프로시저 compose를 정의하라. 예를 들어 inc가 인자에 1을 더하는 함수라면 다음 결과가 나온다.

((compose square inc) 6)
>>49

문제로 부터 얻은 것

람다식을 이미 이해했다면 이 문제에 큰 의미를 찾기는 어렵습니다.

문제풀이

문제를 풀는 것은 어렵지 않습니다.

바로 프로시저를 짜보겠습니다.

(define (compose f g)
(lambda (x) (f (g x))))

예시가 잘 실행되는 모습





혹시나 만약에 다음과 같은 오답을 내놓는 분들도 계실것 같습니다.

(define (compose f g)
(f g))





이전 문제인 연습문제 1.41을 제대로 이해했다면 무엇이 문제인지 알 수 있습니다.

(f (g x)) \neq ((f g) x)





예를 들어 square와 inc를 아래와 같은 방법으로 합성한다고 가정합시다.
((square inc) 5)

square의 정의에 의해
(square inc) = (* inc inc)가 됩니다.
(* inc inc)는 당연히 말이 안됩니다. 프로시저끼리 곱연산을 할 수는 없습니다.

inc의 결과값끼리 곱연산을 하는 것인데 가능하지 않느냐?고 생각하실 분도 계실것 같습니다.
f와 g의 합성함수는 프로시저를 반환해야 제대로 작동하는 것입니다.
그런데, (* inc inc)는 프로시저를 반환하는 함수가 아닙니다.
그러므로 위 함수 (f g)는 설계의도에서 벗어난 프로시저입니다.





읽어주셔서 감사합니다.