functional programming

성공적인 프로그래밍

  • 모든 프로그래밍 패러다임은 성공적인 프로그래밍을 위해 존재한다.
  • 성공적인 프로그래밍은 좋은 프로그램을 만드는 일이다.
  • 좋은 프로그램은 사용성, 성능, 확장성, 기획 변경에 대한 대응력 등이 좋다.
  • 이것들을 효율적이고 생산적으로 이루는 일이 성공적인 프로그래밍이다.

함수형 프로그래밍

함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수 효과를 미워하고 조합성을 강조하는 프로그래밍 패러다임이다.

  • 부수 효과를 미워한다. => 순수 함수를 만든다.
  • 조합성을 강조한다. => 모듈화 수준을 높인다.
  • 순수 함수 => 오류를 줄이고 안정성을 높인다.
  • 모듈화 수준이 높다 => 생산성을 높인다.
  • 순수함수의 조합으로 프로그래밍을 해나간다.

순수 함수란?
들어온 인자가 같으면 항상 동일한 결과를 반환하는 함수.
함수가 받은 인자 외에 다른 외부 상태에 영향을 끼치지 않는 함수를 말한다.
리턴값 외에는 외부와 소통하는 일이 없는 함수이다.

/ 순수 함수 /
function add(a, b) {
return a + b;
}

var c = 10;

function add3(a, b) { // 부수 효과가 있는 함수이다. 외부의 변수 값을 바꾸고 있다.
c = b;
return a + b;
}

var obj1 = { val: 10 };
function add5(obj, b) {
return { val: obj.val + b };
}

순수함수가 아닌 함수는 평가시점이 중요하다. 평가시점에 따라서 로직이 정해지게 된다.
그러나 순수함수는 언제 실행해도 항상 동일한 결과는 반환하기 때문에 순수함수가 아닌 함수보다 훨씬 조합성을 강조할 수 있다.

/ 일급 함수 /
var f1 = function(a) { return a * a; };

function f3(f) {
return f();
}

f3(function() { return 10; });

/ add_maker /

function add_maker(a) {
return function(b) {
return a + b;
}
}

var add10 = add_maker(10);
var add20 = add10(20);

function f4(f1, f2, f3) {
return f3(f1() + f2());
}

f4(
function() { return 2; },
function() { return 1; },
function(a) { return a * a; }
);

function _curry(fn) {
return function(a) {
return function(b) {
return fn(a, b)
}
}
}

함수형 프로그래밍은 애플리케이션, 함수의 구성요소, 더 나아가서 언어 자체를 함수처럼 여기도록 만들고, 이러한 함수 개념을 가장 우선순위에 놓는다.
함수형 사고방식은 문제의 해결방법을 동사(함수)들로 구성(조합)하는 것.
중복을 줄이거나 추상화를 한다.

응용형함수란?
함수가 함수를 받아서 원하는 시점에 해당하는 함수가 알고 있는 인자를 적용하는 식의 프로그래밍.