참고서 : 하스켈로 배우는 함수형 프로그래밍(오카와 노리유키 저, 정인식 번)

함수형 프로그래밍에서 함수

함수형 프로그래밍에서 “함수”란 주어진 입력 값만으로 단지 하나의 출력되는 값을 결정하는 규칙이라는 수학적 의미의 함수

1
2
3
4
// C++
void say(const std::string& something) {
std::cout << something << std::endl;
}
  • 이 함수는 외부로 문자 출력을 하기 때문에 외부의 상황에 의존하므로 항상 같은 결과가 나올 수 없고 따라서 함수형 프로그래밍의 함수가 아니다
1
2
3
4
# Ruby
def current # 외부에서 현재 시각을 가져옴 (때에 따라 결과가 다름)
Time.now
end
1
2
3
4
5
std::string show(const int n) {
std::ostringstream oss;
oss << n;
return oss.str();
}
  • show 함수는 주어진 숫자에 대해서만 그 값의 문자열 표현을 얻는다
  • 동일 숫자를 부여하면 언제 어디서나 동일한 문자열 표현을 얻을 수 있으므로 이 함수가 수학적인 의미에서 함수이다
1
2
3
def total(numbers)
numbers.inject(:+)
end
  • total 함수도 같은 숫자의 배열을 부여하면 동일한 합계를 얻을 수 있기 때문에 수학적인 의미의 함수이다
  • 프로그래밍에서 상태를 참조하거나 상태에 변화를 줌으로써 다음 번 이후의 결과에까지 영향을 미치는 효과를 부작용이라 한다
  • 따라서 이 부작용이 있으면 함수형 프로그래밍의 함수라 부를 수 없다

프로그래밍의 패러다임

  • 프로그래밍에서 프로그래밍 패러다임이란 프로그램이나 그것에 대상이 되는 문제 자체를 어떤 식으로 볼 것인가라는 것이다
  • 명령형 프로그래밍의 경우 프로그램은 컴퓨터가 수행해야 할 명령의 나열
  • 객체지향 프로그래밍의 경우 프로그램은 객체와 그것들의 메세징
  • 함수형 프로그래밍의 패러다임은 프로그램은 함수이며 커다란 프로그램은 작은 프로그램의 조합으로 구성된다
  • 이 때 조합의 용이성/부품으로서의 독립성을 모듈화라고 부른다
  • 함수에 입력 가능한 값 전체로 이루어진 집합을 정의역, 출력 가능한 값 전체로 이루어진 집합을 치역이라고 한다
  • 함수형 프로그래밍에서 함수에 해당하지 않는 것은 일반적으로 모듈화에 좋지 않다 (수학적인 의미에서 함수만 사용하기 = 절차를 취급하지 않기의 제약이 있음)

함수형 언어라?

■ 함수형 언어이기 위한 조건

  • 리터럴이 있다 : 람다식에 의한 함수의 리터럴
  • 실행시간에 생성할 수 있다 : 함수 합성에 의해서 혹은 부분 적용, 고차 함수 등에 의해 함수를 실행시간에 생성할 수 있다
  • 변수에 넣어서 취급할 수 있다
  • 절차나 함수에 인수로서 제공할 수 있다 : 정의역이 특정 함수의 집합이 되는 함수를 만들 수 있다
  • 절차나 함수의 결과로서 반환할 수 있다 : 치역이 특정 함수의 집합이 되는 함수를 만들 수 있다