합성과 map
함수를 재료로 넣으면 무엇을 만들 수 있을까?
화면을 누르면 다음 장으로 넘어갑니다
함수 합성
두 함수를 이어 붙이면 한 함수가 됩니다
h가 f와 g의 합성(composition)이면 h(x) = f(g(x))입니다. 안쪽의 g를 먼저 적용하고, 그 결과에 f를 적용합니다. 그림에서 g는 3을 곱하고 f는 2를 더합니다.
Scheme으로는 (DEFINE (g x) (* 3 x)), (DEFINE (f x) (+ 2 x))입니다. 넣은 값 4는 예시입니다.
compose
합성도 함수가 해 줍니다
compose는 함수 둘을 받아 새 함수를 돌려주는 고차 함수입니다. 돌려주는 것은 계산한 값이 아니라 LAMBDA로 만든 함수입니다. 받는 것도 내놓는 것도 함수입니다.
교재에는 한 줄로 적혀 있습니다. 여기서는 두 줄로 나눠 적었습니다.
써 보기
CAR와 CDR를 합성하면 둘째 요소가 나옵니다
((compose CAR CDR) '((a b) c d))의 값은 c입니다. CDR가 먼저 첫 요소 (a b)를 떼어 (c d)를 남기고, CAR가 거기서 첫 요소 c를 꺼냅니다.
CDR를 두 번 한 뒤 CAR를 하도록 합성하면 셋째 요소를 꺼냅니다. Scheme의 CADDR와 같습니다.
모든 원소에
map은 원소마다 같은 함수를 찍습니다
모든 원소에 적용(apply-to-all)이라는 함수형 형식입니다. Scheme의 map은 받은 함수를 리스트의 모든 원소에 적용해 새 리스트를 만듭니다. 세제곱 함수를 (3 4 2 6)에 적용하면 (27 64 8 216)입니다.
교재에는 한 줄로 적혀 있습니다. num은 원소 하나를 받는 매개변수입니다.
map의 속
map도 재귀로 만듭니다
map의 정의는 5편의 member와 같은 모양입니다. 리스트가 비었으면 빈 리스트를 돌려줍니다. 아니면 첫 요소에 함수를 적용한 값을, 나머지에 map을 다시 부른 결과 앞에 CONS로 붙입니다.
fun은 매개변수로 받은 함수, '()는 빈 리스트입니다.
정리
대입문과 반복문 대신 이 네 가지
함수형 언어는 대입문과 반복문 대신 이 네 가지로 프로그램의 실행을 이끕니다. 3편부터 여기까지 Scheme으로 본 것이 모두 이 안에 들어갑니다.
다음 편