명령형 언어 프로그래밍 방식은 일련의 명령문을 나열하여 이들이 순차 실행 혹은 실행되도록 하는 것이나. 함수형 프로그래밍은 함수를 결합하여 좀 더 강력한 함수를 만드는 것이다.
함수형 프로그래밍의 이론적 가치는 1930년대에 A.Church가 고안한 lambda calculus이며, 1970년대에는 Danaswtt와 Christopher Strachey의 표기적 의미론(denotational semantics)에 의하여 모든 프로그램은 함수로 표현될 수 있다고 한다.
함수 언어 중에서 대표적인 것은 Lisp이며, 이밖에 APL과 여러 가지 Lisp의 변종을 들 수 있다. 그러나 대부분의 함수 언어들은 명령형 언어의 효율성을 영향받아 명령적(비 적용적) 특성들을 일부 포함하게 되었다. 이에 대하여 본래의 John McCarthy의 Lisp나 Hope처럼 순수 함수로만 구성된 것을 순수 함수형(purely function) 언어라고 한다.
함수형 프로그래밍의 특징은 한 마디로 참조 투명성이 있기 때문에 프로그램의 해독, 수정, 검증이 용이하다. 그리고 프로그램이 함수로 이루어지므로 의미적으로 우아하고 구문이 간결하여 표현력이 강하여 프로그램의 생산성을 높일 수 있다는 것이다.
함수
함수는 한 집합(정의적 집합)의 원소를 다른 집합(지역 집합)의 원소로 사상(mapping)시키는 규칙이다. 예를 들어, "square"라는 함수는 정수 집합의 원소를 정수 집합의 다른 원소로 사상시킨다. 함수 정의(function) definition)에서는 정의역, 치역, 함수의 사상 규칙을 정의해 준다. 이단 함수가 정의되면 이를 정의역 집합의 임의의 원소에 적용할 수 있다. 이러한 적용에 해당 원소를 얻게 된다.
예를 들어, square(x) = x*x (단, x는 정수)는 정수를 또 다른 사상시키는 "square"라는 이름의 함수를 정의한 것이다. 이 정의에서 x는 매개 변수로서 정의역 내의 임의의 원소이다.
함수 적용 시 정의역의 어떤 원소가 공급되는데, 이를 인수(argument)라 부른다. 함수의 매개 변수가 이 원소로 대체되며, square(2)는 위의 정의에 따라 4의 결과값을 갖는다.
매개 변수 x는 수학적 변수로서 프로그래밍 변수와는 다르다. 함수 정의에서 x는 정의역 내의 임의의 원소를 의미한다. 함수 적용 시 이는 하나의 값을 갖게 되며 이 값은 이후부터는 변하지 않는다. 이와는 대조적으로 프로그래밍 변수는 프로그램 실행 도중 다른 값을 가질 수 있다.
위의 함수 정의에서 함수 (x*x)의 정의에 "square"라는 이름을 붙였다. 간혹 이르미 없는 함수를 쓰는 것이 편리할 때가 있는데 이는 람다식(lamda expression)을 이용하면 된다. 람다식에서는 매개 변수 및 사상 규칙이 함께 기술된다.
댓글