A beginner friendly intro to functional programming
Functional programming is a highly valued approach to writing code, and it’s popularity is continuously increasing in 상용 소프트웨어 응용 프로그램. 기능적인 프로그래밍 패러다임의 코드를 작성하고 설득력을 넣어의 소개에 이 위키 문서에서:
“의 스타일-건축 구조물 및 요소의 컴퓨터 프로그램—는 계산을 취급으로 평가의 수학적 기능 및 방지 변경 상태 및 변경 가능한 데이터이다. 선언적 프로그래밍 패러다임인데,이는 프로그래밍이 명령문 대신 표현식이나 선언으로 수행된다는 것을 의미합니다.”
우리는 이것이 정확히 의미하는 바에 곧 들어갈 것이지만,먼저 몇 가지 맥락을 제공함으로써 기본을 벗어나자. 이 문서의 목적을 제공하는 희망을 소개합의 기본 개념을 프로그래밍 기능은 당신과 그것의 끝에서,우리는 설정의 기본적인 이해를 우리가 왜 선택했는 적용으로 우리의 코딩 스타일에 관한 방법을 자바스크립트 및 몇몇 기본적인 패턴을 시작할 수 있습으로 실행 당신의 코드입니다. 이 하나에 구축하고 여기에 논의 된 아이디어에 더 깊이 파고 것입니다 두 번째 기사에 대한 경계합니다.
의 뿌리를 프로그래밍에 거짓말 Lambda 미적분이었다 개발한 시스템에서 1930 년대 표현하는 계산 기능을 사용하여 비슷하게 우리가 무엇을 볼 것입니다. 는,기능적 프로그래밍 개념과 언어가 널리 논의에 학계와 학술 컨텍스트 및 결국 블로 개발의 상업적인 소프트웨어입니다. 어떤 프로그래밍 언어의 기능 또는지 그것의 기능을 촉진하는 프로그래밍 패러다임의 언어 같은 이들은 Ruby,Python,줄리아와 자바스크립트,후자의 특성을의 필수적,객체 지향 및 기능성이 큽니다.명령형을 사용하는 예를 살펴본 다음 단일 작업을 완료하는 기능적 접근 방식을 살펴 보겠습니다.나는 이것이 어떻게 작동하는지 잘 모르겠습니다.:
function getOdds2(arr){
return arr.filter(num => num % 2 !== 0)
}console.log(getOdds2(arr))
// logs // this can be even shorter
const getOdds3 = arr => arr.filter(num => num % 2 !== 0)console.log(getOdds3(arr))
// logs
고객께서는 명백한 개선 기능적인 접근 방식은,다음과 같은 짧은 코드,우리를 절약한 부부의 입력,그리고 사실 그것은 훨씬 쉽게 이해할 수 있도록 빠른 한눈에,그것은 또한 우아하는 결과를 청소기 코드를 간단하게 디버깅,테스팅과 관리.두 접근법의 차이점에 대한 명확한 이해에 도달하고 함수형 프로그래밍이 무엇인지 정의 할 수 있도록 이것을 조금 분해합시다.
첫 번째 방법에서 우리는 명령적으로 설명하는 모든 이벤트는 필요를 위해서는 우리를 위해 달성하는 작업의 필터링하고 이상한에서 숫자를 배열입니다. 우리는 함수에 배열을 공급하고,함수 내부에서 우리는 홀수를 저장하는 데 사용할 빈 배열을 만듭니다. 우리는 그것을 말해 루프를 통해 배열을,그 다음 우리는 선언 조건는 경우에,현재의 지수가 홀수이에 밀어 넣습니다습니다. 루프가 포함되지 않은 마지막 번호를 편안,그것은 단지 포함하는 번호를 선도하는것,그렇다면 우리의 마지막 번호가 이상한,그것은 포함되지 않습니다. 따라서 우리는 루프가해야 할 반복의 양을 정의 할 때+1 을 더합니다.
에서 두 번째로 접근 방식,우리는 단순히 정의 결과는 우리가 보고 싶은 방법을 사용하여 소위 필터,고 기계를 돌봐의 모든 단계에서는 사이 있습니다. 이것은보다 선언적 접근 방식입니다. 우리는 최종 결과가 있어야 무엇을 선언하고,우리는 나머지는 우리를 위해 처리됩니다.
이제 우리는 위에서 언급 한 정의가 표현하기 위해 노력하는 것을 볼 수 있습니다. 문이 아닌 선언과 표현식을 사용하여 프로그래밍하는 방법입니다. 이 정의 유의 표면을 긁는 기능 프로그램,그리고 우리는 지속적으로 구축의 정의로 우리의 이해 증가한다.
반복 접근법과 기능적 접근법 사이의 몇 가지 차이점.
- 문체 적으로,우리는 단계별로 설명하는 것과는 반대로 문제와 우리가보고 싶은 변화를 정의합니다.
- 우리는 빈 배열의 상태를 관리 한 위와 같은 함수에서 상태를 관리 할 필요가 없습니다.
- 우리는 실행 순서에 대해 많이 걱정할 필요가 없습니다.
- 우리는 더 적은 루프,조건을 사용하고 더 내장 된 메소드,재사용 가능한 함수 및 재귀를 사용합니다.
이 접근법을 사용하여 궁극적으로 위에서 언급 한 것처럼 디버깅 및 유지 관리에 도움이되는 더 깨끗한 코드를 작성합니다. 그것은 물건을 유지 모듈과 섹션에 우리의 코드 작은 조각으로 분리 테스트 할 수 있습니다. 도우미 함수를 사용하여 코드의 일부를 재사용 할 수 있으며 마지막으로 코드를 작성하는보다 효율적이고 수학적 접근 방식입니다.
기둥: 우리의 코딩 툴킷 쓰기 위한 기능 코드
다음과 같은 몇 가지 중요한 측면을 작성 고품질의 기능 코드입니다. 이는 개요,우리는 없이 다이빙에서 너무 많은 서로 대신 우리는 것입니다 그냥 정의 몇 가지 주요 특성과 하나의 예입니다.
순수 함수:
순수 함수는 전적으로 전달 된 것을 기반으로 값을 반환합니다. 아이디어의 뒤에 그것은 순수한 기능을 경우 그것은 항상 같은 결과를 반환하는 경우 동일한 값으로 통과,그것을 수정하지 않 밖의 값 ts 범위,그것은 독립적인에서 어떤 상태에서 시스템입니다. 따라서 순수한 함수는 결코 데이터를 돌연변이 할 수 없으며 부작용을 일으키지 않으며 쉽게 재사용 할 수 있습니다. 순수하지 않은 함수의 예는 API 호출을 만들거나 예측할 수없는 결과를 반환하는 함수가 될 것입니다.
간단한 불순한 기능:
var tip = 0;function calculateTip( mealTotal ) {
tip = 0.15 * mealTotal;
}calculateTip( 150 )
console.log(tip)
간단한 순수한 기능:
function isPure(x,y) {
return x * y
}console.log(isPure(3,5));
는 순수한 기능을 반환합니다 정확한 결과 모든 시간,그리고 없이 변 모든 데이터의 외부습니다. 중요한 것은 관심을 지불하는 순수한 함수해야에서 멀리 돌연변이 데이터가 무엇이든지,이렇게 선택할 때 주의하는 방법을 사용하여 내부의 순수한 기능입니다. 예를 들어,원하는 경우를 병합하는 두 가지 배열 내의 기능 중 하나로서,일반적으로 수행에 반작용 감속기를 사용하지 마십시오 배열입니다.프로토 타입.푸시()방법. 대신 배열을 사용하고 싶을 것입니다.프로토 타입.concat()는 이전 배열의 상태를 보존하고 사용을 위해 새 배열을 반환합니다.
높이기 위해 기능:
에서 자바스크립트,함수 개체로 처리,따라서 우리는 전달할 수 있는 기능으로 우리는 다른 값입니다. 고차 함수는 단순히 다른 함수에서 작동하는 함수입니다. 그들은 입력으로 함수를 취하거나 출력으로 하나를 반환 할 수 있습니다. 우리는 다음 데모에서 간단한 예를 볼 것입니다.
익명 함수:
익명 함수는 필요에 따라 임시 논리를 정의해야 할 때 매우 유용합니다. 이름에서 알 수 있듯이,익명에서 함수 이름,주로 발견된 인수로 기능으로 대체 이름,기능 함수의 변수에 할당 또는 반환 기능으로서 높이기 위해 기능입니다. 그것은 뿌리가 람다 미적분에 많이 놓여 있으며 모든 함수형 프로그래밍 언어에 매우 중요합니다.변수에 할당 된 익명 함수입니다. 주위를 통과하고 필요할 때 호출하기 쉽습니다.
const myVar = function(){console.log(‘Anonymous function here!’)}myVar()
익명으로 기능을 인수
setInterval(function(){console.log(new Date().getTime())}, 1000);
익명의 사이에서 기능이 더 높은 순수
function mealCall(meal){
return function(message){
return console.log(message + " " + meal + ‘!!’)
}
}const announceDinner = mealCall(‘dinner’)
const announceLunch = mealCall(‘breakfast’)announceDinner(‘hey!, come and get your’)
announceLunch(‘Rise and shine! time for’)
재귀
재귀는 잘 알려진 기능적 프로그래밍 기술을 사용합니다. 재귀 함수는 단순히 자체를 호출하는 함수이므로 동일한 코드를 여러 번 실행하는 루프 역할을합니다. 그것은 하나의주의와 함께 제공하지만,하나는 무한 재귀를 피하기 위해주의해야합니다. 따라서 기본 사례가 필요합니다,중지 할 때 그것을 말해. 재귀 함수 또는 알고리즘은 모두 재귀와 루프를 사용하여 구현할 수 있지만 재귀를 사용하는 것이 좋습니다. 아래는 재귀와 루프를 사용하여 숫자를 인수 분해하기위한 잘 알려진 알고리즘입니다.
재귀적 기능
function factorialize(num){
if (num === 0 || num === 1){return 1;}
return (num * factorialize(num — 1));
}var result = factorialize(14);console.log(result);
재귀를 사용하여 반복
function factorialize(num) {
if (num === 0 || num === 1){
return 1;
}
for (var i = num-1; i >= 1; i-- ) {
num *= i;
}
return num;
}
console.log(factorialize(6));
우리는 몇 가지의 우수한 재료를 쓰는 기능 코드입니다. 응용 프로그램에서 항상 기능 코드를 작성할 수는 없지만 가능한 한 많이 사용하면 이점이 큽니다. 프레임워크처럼 각도와 반응의 영향을 크게 받는 기능,프로그래밍 라이브러리처럼 돌아 Lodash 성을 활용하의 혜택은,그래서 거의 확실히 큰 이득을 시작에서 생각 FP 방법입니다.더 많은 것을 배우기위한
자료? 다음은 추가 학습을위한 훌륭한 기사와 리소스입니다.
- 자바 스크립트에서 함수형 프로그래밍을 배우는 이유는 무엇입니까? 에릭 리
- 웅변하여 자바스크립트에 Marijn Haverbeke
- 그래서 당신이 원하는 기능에 의해 프로그래머 샤 Scalfani
정말로 이 도움이되었고 다음 글에서 우리는 다이빙을 좀 더 깊이 압축을 푼도 더 많은 재미 있고 유용한 도구는 자바스크립트 방법,부분 응용 프로그램,변환,바인딩을 인수하고 더 많은.
박수,공유,비판 또는 주제에 대한 생각을 공유 주시기 바랍니다!