소개
함수형 프로그래밍은 모든 것을 순수한 수학 함수 스타일로 묶으려고 하는 프로그래밍 패러다임입니다. 선언적 유형의 프로그래밍 스타일입니다. 해결 방법에 중점을 두는 명령형 스타일과 달리 해결 방법에 중점을 둡니다. 명령문 대신 표현식을 사용합니다. 표현식은 값을 생성하기 위해 평가되는 반면 명령문은 변수를 할당하기 위해 실행됩니다. 이러한 함수에는 아래에 설명된 몇 가지 특별한 기능이 있습니다.
함수형 프로그래밍은 람다 미적분학(Lambda Calculus)을 기반으로 합니다.
람다 미적분학(Lambda calculus)은 Alonzo Church가 함수를 사용한 계산을 연구하기 위해 개발한 프레임워크입니다. 세상에서 가장 작은 프로그래밍 언어라고 할 수 있습니다. 이는 계산 가능한 것에 대한 정의를 제공합니다. 람다 미적분학으로 계산할 수 있는 모든 것은 계산 가능합니다. 계산 능력은 튜링 기계와 동일합니다. 이는 기능과 평가를 설명하기 위한 이론적 틀을 제공합니다. 이는 현재 거의 모든 함수형 프로그래밍 언어의 기초를 형성합니다.
사실: Alan Turing은 명령형 프로그래밍 스타일의 기초를 놓은 Turing Machine을 만든 Alonzo Church의 학생이었습니다.
함수형 프로그래밍을 지원하는 프로그래밍 언어: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
함수형 프로그래밍의 개념:
- 순수 기능
- 재귀 참조 투명성 함수는 일류이며 고차 변수가 될 수 있습니다. 변수는 불변입니다.
순수 기능: 이러한 함수에는 두 가지 주요 속성이 있습니다. 첫째, 그들은 다른 것에 관계없이 항상 동일한 인수에 대해 동일한 출력을 생성합니다.
둘째, 부작용이 없습니다. 즉, 인수나 로컬/전역 변수 또는 입력/출력 스트림을 수정하지 않습니다.
나중에 속성을 불변성이라고 합니다. 순수 함수의 유일한 결과는 반환하는 값입니다. 그것들은 결정적입니다.
함수형 프로그래밍을 사용하여 수행된 프로그램은 순수 함수에 부작용이나 숨겨진 I/O가 없기 때문에 디버깅하기 쉽습니다. 순수 함수를 사용하면 병렬/동시 애플리케이션 작성도 더 쉬워집니다. 코드가 이 스타일로 작성되면 스마트 컴파일러는 많은 작업을 수행할 수 있습니다. 명령을 병렬화하고, 필요할 때 결과를 평가할 때까지 기다릴 수 있으며, 입력이 변경되지 않는 한 결과는 절대 변경되지 않으므로 결과를 기억할 수 있습니다.
순수 함수의 예:
sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>
재귀: 함수형 언어에는 for 또는 while 루프가 없습니다. 기능적 언어의 반복은 재귀를 통해 구현됩니다. 재귀 함수는 기본 사례에 도달할 때까지 반복적으로 자신을 호출합니다.
재귀 함수의 예:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
참조 투명성: 기능적 프로그램에서 변수는 일단 정의되면 프로그램 전체에서 그 값을 변경하지 않습니다. 기능적 프로그램에는 할당문이 없습니다. 어떤 값을 저장해야 한다면 대신 새 변수를 정의합니다. 이렇게 하면 모든 변수가 실행 중 언제든지 실제 값으로 대체될 수 있으므로 부작용이 발생할 가능성이 제거됩니다. 모든 변수의 상태는 어느 순간에도 일정합니다.
이진 검색 트리 예
예:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
함수는 일급이며 고차일 수 있습니다. 일급 함수는 일급 변수로 처리됩니다. 첫 번째 클래스 변수는 함수에 매개변수로 전달될 수 있고, 함수에서 반환되거나 데이터 구조에 저장될 수 있습니다. 고차 함수는 다른 함수를 인수로 사용하고 함수를 반환할 수도 있는 함수입니다.
예:
show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function> 변수는 불변입니다: 함수형 프로그래밍에서는 변수가 초기화된 후에는 수정할 수 없습니다. 새로운 변수를 생성할 수 있지만 기존 변수를 수정할 수는 없으며 이는 프로그램 런타임 전체에서 상태를 유지하는 데 큰 도움이 됩니다. 변수를 만들고 그 값을 설정하면 해당 변수의 값이 절대 변하지 않는다는 것을 확신할 수 있습니다.
함수형 프로그래밍의 장점과 단점
장점:
- 순수 함수는 상태를 변경하지 않고 주어진 입력에만 의존하기 때문에 이해하기가 더 쉽습니다. 그들이 생산하는 출력은 그들이 제공하는 반환 값입니다. 해당 함수 서명은 반환 유형 및 인수와 같은 모든 정보를 제공합니다.
- 함수를 값으로 처리하고 함수에 매개변수로 전달하는 함수형 프로그래밍 언어의 기능은 코드를 더 읽기 쉽고 이해하기 쉽게 만듭니다.
- 테스트 및 디버깅이 더 쉽습니다. 순수 함수는 인수만 취하고 출력을 생성하기 때문에 어떤 변경도 생성하지 않으며 입력을 받지도 않고 숨겨진 출력도 생성하지 않습니다. 불변 값을 사용하므로 순수 함수를 사용하여 작성된 프로그램의 일부 문제를 확인하는 것이 더 쉬워집니다.
- 순수 함수는 변수나 그 밖의 다른 데이터를 변경하지 않기 때문에 동시성/병렬성을 구현하는 데 사용됩니다.
- 값이 필요할 때만 평가되고 저장되므로 반복 평가를 피하는 지연 평가를 채택합니다.
단점:
- 때로는 순수 함수를 작성하면 코드 가독성이 떨어질 수 있습니다.
- 루프를 사용하는 대신 재귀적 스타일로 프로그램을 작성하는 것은 다소 어려울 수 있습니다.
- 순수 함수를 작성하는 것은 쉽지만 이를 나머지 애플리케이션 및 I/O 작업과 결합하는 것은 어려운 작업입니다.
- 불변 값과 재귀로 인해 성능이 저하될 수 있습니다.
신청:
슬로카 메타
- 수학적 계산에 사용됩니다.
- 동시성 또는 병렬성이 필요한 경우에 필요합니다.
사실: Whatsapp의 900M에는 50명의 엔지니어만 필요합니다. 사용자 왜냐하면 Erlang은 동시성 요구 사항을 구현하는 데 사용되기 때문입니다. Facebook은 스팸 방지 시스템에 Haskell을 사용합니다.