Sunday, September 06, 2009

포인트-프리 스타일 (Point-free style in Haskell)

C나 Java와 같은 절차식언어에 비해서 함수형 언어에는 조금 다른 점이 있다.
그것은 절차식 언어가 '변수'를 어떻게 변화시켜나가느냐를 가지고 원하는 결과를 얻는다면, 함수형 언어는 어떤 방법('함수')를 써서 원하는 결과를 얻느냐는 것이다.

Haskell에서 함수를 연결하는 것으로 $이나 .(함수합성)을 자주 사용한다.
$는 전달되는 변수를 일일이 기재해 주어야 한다.
이에 반해서 함수합성은 변수를 감춘다. 이러한 점이 절차식 언어의 프로그램에 익숙해져 있는 사람들에게는 매우 불편하게 여겨진다. '변수'중심의 코딩방식에 익숙해져 있는 탓이다.

Haskell에서는 컴파일시에 type check가 매우 엄격하다. 이는 Hasekll에서의 함수는, type만 맞으면 어떠한 변수든지 처리하는데 문제가 없다는 것이다(좀 극단적인 표현임). 즉, 함수에 굳이 변수를 기입할 필요가 없다. 함수로 유입되는 type만 맞추어 준다면 원하는 결과를 얻기 때문이다.

Haskell에서 변수 중심의 사고를 버려야 하는 또하나의 이유가 있다.
그것은 Haskell의 '변수'는 값이 변하지 않기 때문이다.
예를 들어 x=1이라고 하면 어떠한 방법을 사용해도 x는 1 이외의 값을 가지지 못하기 때문이다. C로 말한다면 #DEFINE에 해당된다.
그러나 실제로 Haskell 계열의 interpreter로 x의 값을 변화시켜 보면 변한다.
Prelude> x = 1 로 주어두고서 다시 x=2를 하면 x의 값이 2로 바뀌어 있다.
이 때문에 Haskell에서도 변수의 값을 변화시킬 수 있다고 믿는 분들이 있는 듯 하다.
하지만 내부적으로는 1이 입력된 x와 2가 입력된 x는 전혀 다른 x이다.
즉, Haskell에서의 '변수'를 절차식 언어에서와 같은 '변수'로 간주하고 사용한다면 그 안전성을 보장할 수 없는 것이다.


Haskell에서의 point는 권론(카테고리론)에서의 point라 한다. -이 부분은 권론 공부중이지만 독학에는 두뇌의 한계를 느낀다. 궁극적인 point-free style을 지향하는 경우 코드를 읽기 어렵지만, 간단한 코드라면 가능한 포인트-프리 스타일을 사용해 볼 것을 권장한다. 나의 이야기가 아닌 Haskeller들의 공통적인 의견이다.


...간만에 잘난척 좀 해 봤다. 최근 스트레스가 누적된 모양이다. --;

No comments: