함수형 프로그래밍 소개 및 요약(코드 포함)
최근에 함수형 프로그래밍의 고전 입문을 읽고 있는데, 관심이 있거나 필요하신 분은 한 번 읽어보셔도 좋습니다.
1. 함수형 프로그래밍이란
함수형 프로그래밍은 주로 수학적 함수와 그 개념을 기반으로 하기 때문에 먼저 수학에서의 함수, 즉
y = f(x)
, 즉 함수 f를 살펴보겠습니다. (x)는 x를 매개변수로 사용하고 y는 임의의 숫자일 수 있습니다. 여기에는 다음과 같은 몇 가지 핵심 사항이 포함됩니다.
1. 함수는 항상 값을 반환해야 합니다. 3. 함수는 수신된 매개변수에 따라 실행되어야 합니다(예: 이 함수를 분석하려면 먼저 세 번째 항목을 살펴보십시오. 함수는 외부 환경이 아닌 수신된 매개변수에 따라 실행되어야 합니다. 여기서 계산Tax 함수는 외부 백분율값에 의존합니다. 따라서 이 함수는 수학적 의미에서 함수라고 부를 수 없습니다. 그러면 어떻게 수학적 의미에서 함수로 변환할 수 있습니까? 매우 간단합니다
varcalculateTax = (value,percentValue) =>{return value/100 * (100 + ratesValue)};
이제 이 함수를 실제 함수라고 부를 수 있습니다.
2. 참조 투명성
함수 정의에 따르면 모든 함수는 동일한 입력 및 출력에 대해 동일한 값을 반환한다고 결론을 내릴 수 있습니다. 함수의 이러한 속성을 참조 투명성이라고 합니다
// 一个计税函数 var percentValue = 5; var calculateTax = (value) => {return value/100 * (100 + percentValue)};
var identity = (i) => { return i };
sum(4,5) + identity(1);
로 변환할 수 있습니다. 이 프로세스를 대체 모델이라고 부르므로 함수의 결과를 직접 대체할 수 있습니다(주로 이 함수의 논리는 다른 전역 변수에 의존하지 않습니다. 함수는 주어진 입력 결과에 대해 동일한 값을 반환하므로 실제로 이를 캐시할 수 있습니다. 예를 들어 계승을 계산하는 "계수" 함수가 있습니다. 계승을 계산하려면 인수가 필요합니다. 예를 들어 5의 계승은 120입니다. 사용자가 두 번째로 5의 계승값을 입력하면 참조 투명성(동일한 입력에 대해 동일한 결과가 반환됨)으로 인해 결과가 120이라는 것을 알지만 기계는 이를 알 수 없도록 해야 합니다. 향후 호출이 결과를 다시 계산할 필요 없이 직접 반환할 수 있도록 머신이 결과를 캐시합니다. 이는 함수형 프로그래밍에서 참조 투명성과 캐시 가능한 코드의 중요성을 보여줍니다.
3. 함수형, 선언형 및 추상형
함수형 프로그래밍은 선언형 프로그래밍과 추상 코드 작성을 옹호합니다.
sum(4,5) + 1;
var array = [1,2,3]; for(let i = 0; i < array.length; i++){ console.log(array[i]) }
위 코드에서는 배열 길이 가져오기, 배열 반복, 인덱스를 사용하여 배열 요소 가져오기 등을 제거했습니다. 우리는 무엇을 해야 할지(예: 배열 요소 인쇄), 배열 길이 가져오기, 루핑 등 모든 작업을 기계에서 수행하지만, 수행 방법에만 관심을 두면 됩니다. 선언적 프로그래밍
함수형 프로그래밍 제안 코드의 다른 곳에서 재사용할 수 있는 추상적인 방식으로 함수를 만듭니다.
4. 순수함수
순수함수란 무엇인가요? 순수 함수 함수는 주어진 입력에 대해 동일한 출력을 반환합니다. 예를 들어
var arr = [1,2,3]; arr.forEach((ele) => { console.log(ele) })
1.4.1 순수 함수는 테스트 가능한 코드를 생성합니다불순한 함수에는 부작용이 있습니다. 이전 세금 계산 함수를 예로 들어 보겠습니다.
var double = (value) => value * 2;
이 함수는 주로 외부 환경에 따라 달라지기 때문에 순수 함수가 아닙니다. 그 논리를 계산하고 외부 환경이 바뀌면 결과에 영향을 미칩니다. 따라서 순수 함수의 주요 특징은 외부 변수에 의존하지 않으며 외부 변수를 변경해서는 안 된다는 것입니다. 외부 변수를 변경하면 다른 기능의 동작이 변경될 수 있습니다. 즉, 시스템 동작을 예측할 수 없게 만드는 부작용이 발생할 수 있습니다.
1.4.2 합리적인 코드
이중함수 등 이름을 통해 함수의 기능을 유추해야 합니다var double = (value) => value * 2;
我们可以通过函数名轻易的推出这个函数会把给定的数值加倍,因此根据引用透明性,我们可以直接把 double(5) 替换成 10。还有一个例子,Math.max(3,4,5,6) 结果是什么?虽然我们只看到了函数的名字,但是我们很容易看出结果,我们看到实现了吗?并没有,为什么,就是因为 Math.max 是纯函数啊!!!
5、 并发代码
纯函数允许我们并发的执行代码,因为纯函数不会改变它的环境,这意味着我们根本不需要担心同步问题。当然,js 是单线程的,但是如果项目中使用了 webworker 来并发执行任务,该怎么办?或者有一段 Node 环境中的服务端代码需要并发的执行函数,又该怎么办呢?
// 非纯函数代码 let global = 'something' let function1 = (input) => { // 处理 input // 改变 global global = "somethingElse" } let function2 = () => { if(global === "something"){ // 业务逻辑 } }
如果我们需要并发的执行 function1 和 function2,假设 function1 在 function2 之前执行,就会改变 function2 的执行结果,所以并发执行这些代码就会造成不良的影响,现在把这些函数改为纯函数。
let function1 = (input,global) => { // 处理 input // 改变 global global = "somethingElse" } let function2 = (global) => { if(global === "something"){ // 业务逻辑 } }
此处我们把 global 作为两个函数的参数,让它们变成纯函数,这样并发执行的时候就不会有问题了。
6、可缓存
既然纯函数对于给定的输入总能返回相同的输出,那么我们就能缓存函数的输出,例如
var doubleCache = (value) => { const cache = {}; return function(value){ if(!cache[value]){ cache[value] = value * 2 console.log('first time') } return cache[value]; } } var double = doubleCache(); double(2) // first time,4 double(2) // 4 // 或者直接使用立即执行函数 var double = ((value) => { const cache = {}; return function(value){ if(!cache[value]){ cache[value] = value * 2 console.log('first time') } return cache[value]; } })() double(2) // first time,4 double(2) // 4
这个函数中,假设我们第一次输入 5,cache 中并没有,于是执行代码,由于闭包的存在,cache[5] = 10,第二次我们调用的时候,cache[5] 存在,所以直接 return 10,看到了吗?这就是纯函数的魅力!!!别忘记这是因为纯函数的引用透明性。
7、 管道与组合
纯函数应该被设计为一次只做一件事,并且根据函数名就知道它所做的事情。
比如 linux 系统下有很多日常任务的命令,如 cat 用于打印文件内容,grep 用于搜索文件,wc 用于计算行数,这些命令一次只解决一个问题,但是我们可以用管道或组合来完成复杂的任务。假设我们需要在一个文件中找到一个特定的名称并统计它的出现次数,在命令行要输入如下指令
cat jsBook | grep -i “composing” | wc
上面的命令通过组合多个函数解决了我们的问题。组合不是 linux 命令独有的,它们是函数式编程范式的核心。
我们把它们称为函数式组合。来看一个 compose 函数的例子
var add1 = (value) =>{ return value+1 }; var double = (value) => {return value*2 }; var compose = (a,b) => { return (c) => { return a(b(c)); } } var doubleAndAdd1 = compose(add1,double); doubleAndAdd1(5) // 打印 5 * 2 + 1 = 11
compose 函数返回一个函数,将 b 的结果作为 a 的参数,这里就是将 double 的结果作为 add1 的参数,来实现了函数的组合。
8、 纯函数是数学函数
还记得我们之前的缓存函数吗,假设我们多次调用 double 对象,那么 cache 中就会变成这样
{ 1: 2, 2: 4, 3: 6, 4: 8, 5: 10 }
假设我们设置 double 的输入范围限制为 1 - 5,而且我们已经为这个范围建立的 cache 对象,因此只要参照 cache 就能根据指定输入返回指定输出。也就是一一对应的关系。
那么数学函数的定义是什么呢?
在数学中,函数是一种输入集合和可允许的输出集合之间的关系,具有如下属性:每个输入都精确地关联一个输出。函数的输入称为参数,输出称为值。对于一个给定的函数,所有被允许的输入集合称为该函数的定义域,而被允许的输出集合称为值域。
上面的定义和纯函数完全一致,例如在 double 中,你能找到定义域和值域吗?当然可以!通过这个例子,可以很容易看到数学函数的思想被借鉴到函数式范式的世界
9、 我们要做什么?
我们将通过学习,构建出一个 ES6-Functional 的函数式库,通过构建的过程,我们将理解如何使用 JavaScript 函数,以及如何在日常工作中应用函数式编程。
10、小结
这一节我们只是简单的介绍了函数式编程的概念,以及什么是纯函数,其中最重要的就是引用透明性。然后研究了几个短小的例子,通过例子来加深对函数式编程的理解。接下来我们将一步一步深入了解函数式编程。
위 내용은 함수형 프로그래밍 소개 및 요약(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











현대 프로그래밍 세계에서 함수형 프로그래밍(FP)은 점차 인기 있는 프로그래밍 패러다임이 되었습니다. 프로그램을 구축하기 위한 기본 빌딩 블록으로 기능을 사용하는 것을 강조하고 계산 프로세스를 기능 간의 지속적인 전송 및 변환으로 간주합니다. 최근 몇 년 동안 Go 언어(Golang이라고도 함)는 단순성, 효율성, 동시성 안전성 및 기타 특성으로 인해 점차 다양한 분야에서 널리 사용되고 있습니다. Go 언어 자체는 순전히 함수형 프로그래밍 언어는 아니지만 충분한 기능을 제공합니다.

C++ 언어에는 뛰어난 프로그래밍 기술이 많이 있으며, 그 중 함수형 프로그래밍은 매우 실용적인 기술입니다. 함수형 프로그래밍은 함수의 재사용성과 유연성을 강조하여 코드를 더 명확하고 유지 관리하기 쉽게 만듭니다. 이번 글에서는 C++의 함수형 프로그래밍 기법을 소개하겠습니다. 1. 함수 객체 함수 객체는 함수로 간주될 수 있는 호출 가능한 객체입니다. C++의 함수 개체는 클래스 개체 또는 함수 포인터일 수 있습니다. 함수 객체는 STL 알고리즘에서 사용될 수 있으며 다른 함수의 매개변수로도 사용될 수 있습니다. 여기에 간단한

C++ 람다 식은 다음을 포함하여 함수형 프로그래밍에 이점을 제공합니다. 단순성: 익명 인라인 함수는 코드 가독성을 향상시킵니다. 코드 재사용: 코드 재사용을 용이하게 하기 위해 람다 표현식을 전달하거나 저장할 수 있습니다. 캡슐화: 별도의 함수를 만들지 않고도 코드 조각을 캡슐화하는 방법을 제공합니다. 실제 사례: 목록에서 홀수를 필터링합니다. 목록의 요소 합계를 계산합니다. 람다 표현식은 함수형 프로그래밍의 단순성, 재사용성 및 캡슐화를 달성합니다.

게으른 평가는 게으른 데이터 구조를 사용하여 Go에서 구현할 수 있습니다. 즉, 실제 값을 캡슐화하고 필요할 때만 평가하는 래퍼 유형을 생성합니다. 실제로 필요할 때까지 중간 값 계산을 연기하여 기능적 프로그램에서 피보나치 수열 계산을 최적화합니다. 이는 불필요한 오버헤드를 제거하고 기능적 프로그램의 성능을 향상시킬 수 있습니다.

Go에서 함수형 프로그래밍을 사용할 때 주의해야 할 5가지 일반적인 실수와 함정이 있습니다. 실수로 참조를 수정하지 말고 새로 생성된 변수가 반환되는지 확인하세요. 동시성 문제를 해결하려면 동기화 메커니즘을 사용하거나 외부 변경 가능 상태 캡처를 피하세요. 코드 가독성과 유지 관리성을 향상하려면 부분 기능화를 아껴서 사용하세요. 애플리케이션의 견고성을 보장하기 위해 항상 함수의 오류를 처리하십시오. 인라인 함수, 평면화된 데이터 구조 및 작업 일괄 처리를 사용하여 성능에 미치는 영향을 고려하고 코드를 최적화하세요.

pythonLambda 표현식은 간결하고 읽기 쉽고 사용하기 쉬운 코드를 생성하기 위한 강력하고 유연한 도구입니다. 다른 함수에 인수로 전달되거나 변수에 저장될 수 있는 익명 함수를 빠르게 생성하는 데 유용합니다. Lambda 표현식의 기본 구문은 다음과 같습니다.lambdaarguments:expression예를 들어 다음 Lambda 표현식은 두 개의 숫자를 추가합니다.lambdax,y:x+y 이 Lambda 표현식은 다음과 같이 다른 함수에 인수로 전달될 수 있습니다. defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2)이 예에서는

Python의 람다 표현식은 익명 함수의 또 다른 구문 형태입니다. 프로그램 어디에서나 정의할 수 있는 작은 익명 함수입니다. 람다 식은 매개변수 목록과 유효한 Python 식일 수 있는 식으로 구성됩니다. Lambda 표현식의 구문은 다음과 같습니다:lambdaargument_list:expression.예를 들어 다음 Lambda 표현식은 두 숫자의 합계를 반환합니다:lambdax,y:x+y 이 Lambda 표현식은 맵과 같은 다른 함수에 전달될 수 있습니다. () 함수: 숫자=[ 1,2,3,4,5]결과=맵(람다

컴퓨터 분야에서 C++가 널리 적용되고 프로그래밍 패러다임이 지속적으로 탐구됨에 따라 함수형 프로그래밍도 큰 관심 주제가 되었습니다. C++의 함수형 프로그래밍에는 특별한 개념과 구문이 많아 인터뷰에서 관련 질문이 나오는 경우가 많습니다. 이 기사에서는 C++의 함수형 프로그래밍에 대한 일반적인 인터뷰 질문을 요약하고 답변합니다. 1. 함수형 프로그래밍의 장점과 단점 면접관은 함수형 프로그래밍의 장점과 단점에 대해 어떻게 이해했는지 물어볼 수 있습니다. 함수형 프로그래밍에는 다음과 같은 장점이 있습니다. 가독성이 높습니다. 함수형 프로그래밍은 함수의 출력에만 초점을 맞춥니다.
