이 글은 아래 두 페이지 글을 번역한 것입니다.
함수형 프로그래밍은 모든 것을 순수한 수학 함수 스타일로 묶는 프로그래밍 패러다임입니다.
이것은 선언적 프로그래밍 스타일입니다. 그 주요 초점은 '어떻게 해결할 것인가 "이며, 주요 초점이"어떻게 해결할 것인가 "인 명령형과는 대조적입니다.
명령문 대신 표현식을 사용합니다. 표현식은 값을 생성하기 위해 평가되는 반면 명령문은 변수를 할당하기 위해 실행됩니다.
이러한 기능에는 아래에 설명된 몇 가지 특별한 기능이 있습니다.
람다 계산법은 함수를 사용하여 계산을 연구하기 위해 알론조 처치에 의해 개발된 프레임 워크입니다.
세계에서 가장 작은 프로그래밍 언어로 계산 가능한 것에 대한 정의를 제공합니다.
람다 계산법으로 계산할 수 있는 것은 모두 계산 가능합니다. 계산 능력은 튜링 머신과 동일합니다.
람다 계산법은 함수와 그 평가를 설명하기 위한 이론적 프레임 워크를 제공합니다.
이것은 현재 거의 모든 함수형 프로그래밍 언어의 기초를 형성하고 있습니다.
Fact: Alan Turing은 명령형 프로그래밍 스타일의 토대를 마련 튜링 기계를 만든 Alonzo Church 학생이었습니다.
Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
이 함수는 2 개의 주요 특성이 있습니다.
먼저 다른 것들에 관계없이 동일한 인수에 대해 항상 같은 출력을 생성합니다.
둘째, 그들에는 부작용이 없습니다. 즉, 인수 및 글로벌 변수를 변경하거나 뭔가를 출력하거나 합니다.
두 번째 속성을 불변성이라고 합니다. 순수 함수의 유일한 결과는 반환 값입니다. 그들은 결정적입니다.
함수형 프로그래밍을 사용하여 실행된 프로그램은 순수 함수에는 부작용이나 숨겨진 I/O가 없기 때문에 디버깅이 용이합니다.
순수 함수는 또한 병렬/동시 프로그램을 더 쉽게 작성할 수 있도록 합니다.
코드가 이 스타일로 작성된 경우 스마트 컴파일러는 많은 것을 할 수 있습니다.
명령을 병렬화하고, 필요할 때 결과를 평가하고, 입력이 변경되지 않는 한 결과가 변경되지 않기 때문에 결과를 기억할 수 있습니다.
예 :
sum(x, y) // sum은 x와 y를 인수로 취하는 함수
return x + y // sum은 x와 y를 변경하지 않고 합을 반환합니다.
함수형 언어에는 "for" 또는 "while"가 없습니다.
함수형 언어의 반복 재귀에 의해 구현됩니다. 재귀 함수는 기본 케이스에 도달할 때까지 반복 자신을 호출합니다.
예 :
fib(n)
if (n <= 1)
return 1;
else
return fib(n - 1) + fib(n - 2)
함수형 프로그램은 한 번 정의된 변수는 프로그램 전체에서 그 값을 변경하지 않습니다.
함수형 프로그램은 할당 문은 없습니다. 값을 저장해야 하는 경우에는 대신 새 변수를 정의합니다.
이렇게 하면 실행 어떤 시점에서 어떤 변수를 실제 값으로 대체할 수 있기 때문에 부작용의 가능성이 배제됩니다. 모든 변수의 상태는 어느 순간에나 일정합니다.
예 :
x = x + 1 // 이렇게 하면 변수 x에 할당된 값이 변경됩니다.
// 따라서 수식은 참조 투명성이 없습니다.
// x의 값을 10이라하면, 이 표현식의 두 번의 수행은 결과를 11과 12로 냅니다.
// x = x + 1을 11 혹은 12로 대체하는 것은 프로그램에 다른 의미를 부여합니다
// 하지만, int plusone(int x) {return x + 1;}과 같은 함수를 호출하는 것은
// 투명합니다. 암시적으로 입력 x를 변경하지 않으며 부작용이 없기 때문입니다.
일급 함수는 일급 변수로 처리됩니다. 일급 변수는 매개 변수로 함수에 전달하거나 함수에서 반환하는 데이터 구조에 저장될 수 있습니다. 고차 함수는 다른 함수를 인수로 사용하고 함수를 반환할 수도 있는 함수입니다.
예 :
show_output(f) // 함수 show_output은 인수 f를 취하여 선언됩니다.
// 이는 다른 함수
f(); // 전달된 함수 호출
print_gfg() // 다른 함수 선언
print("hello gfg");
show_output(print_gfg) // 다른 함수에 함수 전달
함수형 프로그래밍에서 초기화된 후 변수를 변경할 수 없습니다.
새로운 변수를 만들 수 있지만 기존 변수를 변경할 수 없으며 이것은 프로그램의 실행 시 상태를 유지하는 데 매우 유용합니다. 변수를 만들고 해당 값을 설정하면 해당 변수의 값이 절대 변경되지 않는 것을 완전히 확신할 수 있습니다.
Pact: Whatsapp 은 동시성 요구 사항을 구현하는 데 Erlang이 사용되기 때문에 9 억 명의 사용자를 위해 50명의 엔지니어만 필요합니다. Facebook은 스팸 방지 시스템에 Haskell을 사용합니다.
함수형 프로그래밍 | 객체지향 프로그래밍 |
---|---|
특정 작업을 수행하는 함수의 사용에 중점을 둠 | 이 프로그래밍 패러다임은 객체 지향 개념을 기반으로 함 클래스는 객체의 인스턴스가 생성되는 장소에서 사용됨 |
사용되는 기본적인 요소는 변수와 함수임 함수의 데이터는 불변임 (생성 후에 변경할 수 없음) | 사용되는 기본적인 요소는 개체와 메서드임 여기에서 사용되는 데이터는 가변 데이터임 |
중요한 것은 데이터가 아닌 기능임 | 절차보다 데이터가 중요함 |
선언적 프로그래밍 모델을 따름 | 명령형 프로그래밍 모델을 따름 |
반복을 위해 재귀를 사용함 | 반복을 위해 루프를 사용함 |
병렬 프로그래밍이 지원됨 | 병렬 프로그래밍을 지원하지 않음 |
이 프로그래밍 패러다임의 명령문은 실행하는 동안 특정 순서를 따를 필요가 없음 | 이 프로그래밍 패러다임의 명령문은 순서를 따라야 함 즉, 실행하는 동안 상향식 접근 방식을 따라야 함 |
액세스 지정자가 없음 | Public, Private 및 Protected의 세 가지 액세스 지정자가 있음 |
새로운 데이터와 기능을 추가하는 것은 그리 쉽지 않음 | 로운 데이터와 기능을 추가하는 쉬운 방법을 제공함 |
데이터 숨김이 불가능함. 따라서 보안이 불가능함 | 데이터 은닉을 제공함. 그래서 보안 프로그램이 가능함 |