석사과정 때의 일이다. 시뮬레이션을 하기에 파이썬 같은 스크립트 언어는 너무 느리고, 포트란을 배우기는 좀 부담스러워서 C++을 다시 들여다본 적이 있었다. 예전에는 없던 STL이니 Boost니 하는 게 유행하길래 이건 또 뭐야 싶어서 책들을 좀 읽어봤다. 그랬더니 '함수형 프로그래밍' 이런 말이 또 자꾸 나오길래 이건 또 뭐야 싶어서 순수 함수형 언어라는 하스켈을 공부했다. 하스켈을 공부하다보니 또 모나드라는 게 나오길 래 이건 또 뭐야 싶어서(헉헉) 추상대수학의 카테고리론에 바탕을 둔 형식의미론을 공부했다. 세상에 print "hello, world!" 하나에 이렇게 복잡한 수학적 개념을 쓰는 언어는 처음 봤다. 그렇게 삼천포로 빠지다보니 어느새 석사 논문을 쓸 때가 되어버렸다. 시뮬레이션은 물 건너 갔지만 다행스럽게도 형식의미론은 컴퓨터 프로그램의 계산적 의미를 논하는 것이라 논문에 가져다 쓰기가 아주 좋았다. 게다가 카테고리론은 다이어그램을 그려놓으면 아주 예쁘다. 이런 식으로 하스켈 때문이 인생이 조금 꼬이기도 하고 풀리기도 해서 애증이 좀 있다.
류광님의
C++0x 미리보기 12, 표현식의 형식을 알려주는 decltype를 보니 C++은 이제 문법 수준에서도 점점 하스켈을 닮아가는 모양이다. 자료형 추론에 람다 함수에.. 하지만 여전히 길고 산만하다.
<template typename T, typename U> auto f(T x, U y) -> decltype(x*y) { return x*y; }
하스켈이라면 똑같은 표현을 다음과 같이 쓸 수 있다. 얼마나 쉬워. 함수 f x y는 x*y. 끝.
f x y = x*y
그리고 자료형도 컴파일러가 다음과 같이 정확히 추론한다. (Num '인터페이스'를 구현한 자료형 a에 해당하는 값 두 개를 받아 하나를 반환한다는 의미임.)
f :: (Num a) => a -> a -> a
어차피 자료형 추론 알고리듬을 다른 걸 쓰는 건 아닐테니까 C++에서도 마찬가지로 할 수 있지 않을까. 그러니까 이렇게.
f(x,y){ return x*y; }
요렇게만 해도 된다면 파이썬이고 하스켈이고 다 버리고 C++만 쓸텐데. 아무래도 어렵겠지?