brunch

FP - 권능의 일급시민 feat. 람다 칼큘러스

FP의 필수요소

by mars

우리는 현대 사회에서 당연한 권리로 여겨지는 소유권, 투표권, 표현의 자유 등을 누리고 있다. (여기서 잠깐, 이런 권리를 쟁취해 주신 분들께 감사의 마음을 전하며...) 하지만 이러한 권리를 온전히 누릴 수 있는 계층은 제한적이며, 이러한 특권 계층의 사람들을 흔히 일급 시민(First-Class Citizen)이라고 부른다.


흥미롭게도, 이런 일급 시민의 권리를 프로그래밍 세계에서도 쟁취해 준 위대한 수학자가 있다. 바로 알론조 처치(Alonzo Church)다. 그는 함수형 프로그래밍과 컴퓨터 과학의 근간이 되는 람다 계산법(Lambda Calculus)의 창시자로, 패러다임과 코틀린에 잠깐 등장하셨던 분이기도 하다. (참고로, 그와 비슷한 시기에 앨런 튜링은 튜링 기계를 모델링하며 계산 가능성 이론을 정립했다.)


람다 계산법의 핵심 개념은 생각보다 간단해서 누구나 1분 안에 이해할 수 있다. 더하여 이 개념을 이해하면 프로그래밍에서 사용하는 일급 시민(First-Class Citizen)의 의미도 자연스럽게 파악할 수 있다. 그러니 잠깐만 시간을 내어 살펴보자. (정말 간단함, 한 번만 속아주자.)


람다 계산법 이해하기

람다 계산법은 프로그래밍의 함수와 매우 유사하다. 코틀린에서 함수를 정의할 때 사용하는 키워드는 fun이다. 반면, 알론조 처치는 람다의 키워드로 λ (람다 기호)를 사용했다.


함수 키워드: fun

람다 키워드: λ


람다에도 파라미터의 개념이 존재하며, 파라미터의 위치는 람다 키워드 바로 뒤다. 예를 들어 λx는 파라미터 x를 가지는 람다를 의미한다. 이를 코틀린 함수와 알론조 처치의 람다로 비교해 보면 다음과 같다.


함수의 파라미터: fun (x: Int)

람다의 파라미터: λx


코틀린 함수는 익명 함수의 문법이다. 맞다, 람다도 익명 함수이다!


코틀린에서 함수의 바디를 할당문(=)으로 시작할 수 있다. 아래는 파라미터에 1을 더하는 익명 함수이다.

fun (x: Int) = x + 1


람다의 바디는 마침표(.)로 시작한다. 마찬가지로 파라미터에 1을 더하는 람다는 아래와 같다.

λx.x+1


이제 이 둘을 비교해 보면 아래와 같다.

함수: fun (x: Int) = x + 1

람다: λx.x+1


람다의 파라미터에 값을 전달하기 위해서는 간단히 람다 바로 뒤에 값을 쓰면 된다. 예를 들어 람다에 3을 파라미터로 전달하고자 한다면 아래와 같이 쓴다.

λx.x+1 3


마지막으로 이 람다를 실행시키는 위해서는 전체를 괄호로 감싸야한다.

(λx.x+1 3)


여기까지의 과정을 코틀린 vs 람다로 비교해 보면 아래와 같다. (왜 람다가 더 편해보이지??)

함수의 호출: (fun (x: Int) = x + 1)(3)

람다의 호출: (λx.x+1 3)


이제 우리는 람다 계산법이 무엇인지는 이해했다. 그런데 정작 우리가 원래 알아보기로 했던 것은 일급 시민이 아니었나, 빨리 알론조 처치의 고민으로 돌아가 보자.


일급 시민의 니즈

람다를 기반으로 복잡한 수식을 표현하려다 보니, 간단한 람다를 여러 개 사용하고 이를 조합하여 더 복잡한 람다를 만들어야 할 필요가 생겼다. 그런데 이런 복잡한 람다를 표현하기 위해서는, 람다를 다른 람다의 입력으로 전달할 수 있는 방법이 반드시 필요했다. 즉 람다를 변수처럼 다룰 수 있는 권리, 다시 말해 변수의 권리를 람다에게 부여할 방안이 필요했던 것이다.


이런 이유로, 알론조 처지는 람다에게 변수와 동등한 권리를 제공했으며, 그 결과 람다는 마치 값처럼 취급될 수 있었다. 람다는 변수에 할당되거나, 다른 람다의 파라미터로 전달되거나, 혹은 람다의 결과값이 되어 반환될 수 있었다.


프로그래밍의 세계에서 람다처럼 “변수의 권리”를 누리는 시민(citizen)은 특별한 시민으로 바라보기에, 일급 시민(First class Citizen)이라고 부른다. 그리고 이러한 일급 시민에는 일급 함수, 일급 객체, 일급 클래스 등이 존재한다. 함수형 프로그래밍에서 일급 함수는 고차 함수를 이해하는 필수 요소이자, 함수적 다형성을 정의하는 핵심 개념이다. 그러니까 일급 시민의 개념을 이해해야만 고차 함수(higher order function)를 이해할 수 있다는 의미이다. 다시 말해서 이제 우리는 이제 고차 함수를 이해할 준비가 끝났다는 말이다!


지금까지 우리는 람다 계산법과 일급 시민에 대해서 알아봤다. 다만, 알론조 처지는 일급 시민의 개념을 수학적으로 정리한 인물로, 이를 프로그래밍에 적용한 사람은 아니었다. 프로그래밍에서 처음으로 일급 시민을 정의하고 도입한 사람은 크리스토퍼 스트래치였다.



disclaimer

1. 이쯤되면 간단히 설명했다고 믿어주자(제발~).

2. 코틀린 람다함수는 고차함수와 함께 설명하겠다(대부분 이미 아시겠지만).

3. 이급(second class) 작가라 필력이 딸린다 ㅜ..ㅜ




keyword
작가의 이전글boolean 타입의 어원