logo

프로그래밍에서의 고차 함수 📂프로그래밍

프로그래밍에서의 고차 함수

정의

프로그래밍에서 함수가 일급객체일 때, 함수를 인자로 받거나 반환하는 함수를 고차 함수higher-order function라 한다. 이와 대비되는 표현으로써, 고차 함수가 아닌 함수를 일차 함수first-order function이라 한다.


  • 이 정의에서 말하는 함수는 수학에서 말하는 함수가 아닌 컴퓨터 공학적인 함수, 다시 말해 부작용side Effect이 있을 수 있는 함수다.

설명

수학의 범함수

간혹 수학에서 말하는 범함수과 맥락이 비슷하다는 언급이 있던데 자세하게는 설명하는 사람이 없어서 설명한다. 중요한 것은 아니니 모르겠으면 넘어가도 좋다.

수학에서 벡터공간 $X$ 의 함수 $\lambda: X \to \mathbb{C}$ 를 범함수라 하고 그 중에서도 연속이고 선형인 범함수들의 집합인 듀얼 스페이스를 $X^{\ast}$ 와 같이 타낸다. 거기서 한 번 더 듀얼을 생각한 $X^{\ast \ast}$ 에서 정의역은 연속 선형 함수 $\lambda: X \to \mathbb{C}$ 의 집합 $X^{\ast}$ 이다. 이것은 프로그래밍에서 함수를 인자로 받는 고차 함수로 볼 수 있다.

거듭 말하지만 혹시나 궁금한 사람이 있을까봐 적었을 뿐 중요하지 않다. 몰라도 된다.

맵과 폴드

꼼꼼히 읽지 말고 대충 읽어라: 함수형 프로그래밍을 선호하는 코더에게 함수형 프로그래밍의 꽃이 무엇인가를 물어본다면 저마다 생각이 다를 수 있겠지만, 함수형 프로그래밍에 관심 없는 코더에게 함수형 프로그래밍의 가장 유용한 부분을 묻는다면 십중팔구 map과 리듀스reduce를 언급할 것이다. 맵은 (1) 함수function와 컬렉션collection을 받아 컬렉션의 각 원소에 함수를 취한 결과의 컬렉션을 리턴하는 (2) 함수고, 폴드fold(1) 함수와 컬렉션을 받아 컬렉션 그 자체에 함수를 취한 결과를 리턴하는 (2) 함수다.

맵과 폴드(리듀스)의 중요성과 편리함을 떠나 정확히 어떤 것인지 지금은 중요하지 않고, 집중해야할 것은 오로지 맵과 폴드가 함수의 함수로써 설명된다는 것이다. 이를 짧게 줄이면 “맵과 리듀스는 고차함수다"가 되고, “함수형 프로그래밍의 장점은 맵이나 리듀스를 쓸 수 있다는 것이다"처럼 비전공자가 이해하기 어렵고 유식해보이는 문장을 구사할 수 있게 된다.