JS에서 절묘한 자동 커링 기능을 구현하는 방법
이 기사는 JS의 절묘한 자동 커링 방법을 자세히 분석하고 코드 예제를 통해 프로세스와 원리를 분석하므로 도움이 되길 바랍니다.
커링이란 무엇인가요?
컴퓨터 과학에서 커링은 여러 매개변수를 받는 함수를 단일 매개변수(원래 함수의 첫 번째 매개변수)를 받는 함수로 변환하고, 나머지 매개변수를 받아 결과를 반환하는 함수를 반환하는 것입니다. 기능 기술. 이 기술은 Moses Schnfinkel과 Gottlob Frege가 발명했지만 논리학자 Haskell Curry의 이름을 따서 Christopher Strachey가 명명했습니다.
이론이 압도적인 것 같나요? 중요하지 않습니다. 먼저 코드를 살펴보겠습니다.
Curriization application
목록의 각 요소에 하나를 추가하는 등 목록 요소에 대한 일부 처리를 수행하는 함수를 구현해야 한다고 가정해 보겠습니다. 생각하기 쉽습니다:
const list = [0, 1, 2, 3]; list.map(elem => elem + 1);
쉽죠? 2개를 더 추가하고 싶다면 어떻게 해야 할까요?
const list = [0, 1, 2, 3]; list.map(elem => elem + 1); list.map(elem => elem + 2);
좀 비효율적인 것 같은데요. 처리 기능을 캡슐화할 수 있나요?
하지만 map의 콜백 함수는 현재 요소 elem만 매개변수로 받아들입니다. 이를 캡슐화할 방법은 없는 것 같습니다...
부분적으로 구성된 함수를 얻을 수 있으면 좋겠다고 생각할 수도 있습니다. , 예:
// plus返回部分配置好的函数 const plus1 = plus(1); const plus2 = plus(2); plus1(5); // => 6 plus2(7); // => 9
다음과 같은 함수를 map에 전달합니다.
const list = [0, 1, 2, 3]; list.map(plus1); // => [1, 2, 3, 4] list.map(plus2); // => [2, 3, 4, 5]
멋지지 않나요? 이렇게 하면 아무리 추가해도 list.map(plus(x))만 있으면 캡슐화를 완벽하게 구현하고 가독성이 크게 향상됩니다!
하지만 질문이 생깁니다. 이러한 플러스 기능을 어떻게 구현하나요?
여기서 커링이 유용합니다:
커링 함수
// 原始的加法函数 function origPlus(a, b) { return a + b; } // 柯里化后的plus函数 function plus(a) { return function(b) { return a + b; } } // ES6写法 const plus = a => b => a + b;
보시다시피 커링 플러스 함수는 먼저 매개변수 a를 받은 다음 매개변수 b 함수를 반환합니다. function은 상위 함수의 매개변수 a에 액세스할 수 있습니다. 예를 들어, const plus2 = plus(2)는 function plus2(b) { return 2 + b }와 동일할 수 있으므로 부분 구성이 가능합니다.
일반인의 관점에서 커링은 다중 매개변수 함수를 부분적으로 구성하는 프로세스이며, 각 단계는 단일 매개변수를 허용하는 부분적으로 구성된 함수를 반환합니다. 극단적인 경우에는 여러 번 추가하는 등 기능을 여러 번 부분적으로 구성해야 할 수도 있습니다.
multiPlus(1)(2)(3); // => 6
이런 작성 방식이 이상해 보이죠? 하지만 JS 함수형 프로그래밍의 큰 함정에 빠지면 이것이 표준이 될 것입니다.
JS에서 자동 커링을 절묘하게 구현
커링은 함수형 프로그래밍에서 매우 중요한 부분입니다(예: 하스켈). 기본적으로 함수가 자동으로 커링됩니다. 하지만 JS에서는 이를 수행하지 않으므로 자동 커링 기능을 직접 구현해야 합니다.
먼저 코드를 입력하세요:
// ES5 function curry(fn) { function _c(restNum, argsList) { return restNum === 0 ? fn.apply(null, argsList) : function(x) { return _c(restNum - 1, argsList.concat(x)); }; } return _c(fn.length, []); } // ES6 const curry = fn => { const _c = (restNum, argsList) => restNum === 0 ? fn(...argsList) : x => _c(restNum - 1, [...argsList, x]); return _c(fn.length, []); } /***************** 使用 *********************/ var plus = curry(function(a, b) { return a + b; }); // ES6 const plus = curry((a, b) => a + b); plus(2)(4); // => 6
이렇게 하면 자동 커링이 이루어집니다!
무슨 일이 일어났는지 이해할 수 있다면 축하합니다! 모두가 당신을 부르는 상사는 당신입니다! , 좋아요를 남기고 기능적 경력을 시작하세요. (재미있습니다
무슨 일이 일어나고 있는지 이해하지 못하더라도 걱정하지 마세요. 지금 아이디어를 정리하는 데 도움을 드릴 것입니다.
요구 사항 분석
카레가 필요해요 커리할 함수를 매개변수로 받아들이고 매개변수를 받은 함수를 반환하는 함수입니다. 받은 매개변수가 목록에 배치되면 원래 함수가 실행되고 결과가 반환됩니다.
구현 방법function(x) { return _c(restNum - 1, argsList.concat(x)); }
function curry(fn) { function _c(restNum, argsList) { return restNum === 0 ? fn.apply(null, argsList) : function(x) { return _c(restNum - 1, argsList.concat(x)); }; } return _c(fn.length, []); // 递归开始 }
// ES6 const curry = fn => { const _c = (restNum, argsList) => restNum === 0 ? fn(...argsList) : x => _c(restNum - 1, [...argsList, x]); return _c(fn.length, []); }
다른 방법과의 비교
function curry(fn) { const len = fn.length; return function judge(...args1) { return args1.length >= len ? fn(...args1): function(...args2) { return judge(...[...args1, ...args2]); } } } // 使用箭头函数 const curry = fn => { const len = fn.length; const judge = (...args1) => args1.length >= len ? fn(...args1) : (...args2) => judge(...[...args1, ...args2]); return judge; }
性能稍差一点。
性能问题
做个测试:
console.time("curry"); const plus = curry((a, b, c, d, e) => a + b + c + d + e); plus(1)(2)(3)(4)(5); console.timeEnd("curry");
在我的电脑(Manjaro Linux,Intel Xeon E5 2665,32GB DDR3 四通道1333Mhz,Node.js 9.2.0)上:
本篇提到的方法耗时约 0.325ms
其他方法的耗时约 0.345ms
差的这一点猜测是闭包的原因。由于闭包的访问比较耗性能,而这种方式形成了两个闭包:fn 和 len,前面提到的方法只形成了 fn 一个闭包,所以造成了这一微小的差距。
相关推荐:
위 내용은 JS에서 절묘한 자동 커링 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 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)

뜨거운 주제











Doubao 앱에는 많은 AI 생성 기능이 있을 예정인데 Doubao 앱에는 어떤 기능이 있나요? 사용자는 이 소프트웨어를 사용하여 그림을 만들고, AI와 채팅하고, 사용자를 위한 기사를 생성하고, 모든 사람이 노래를 검색하도록 도울 수 있습니다. Doubao 앱의 이 기능 소개는 구체적인 작동 방법을 알려드릴 수 있습니다. 구체적인 내용은 아래와 같으니 한번 살펴보세요! Doubao 앱에는 어떤 기능이 있나요? 답변: 그림 그리기, 채팅, 기사 쓰기, 노래 찾기 등이 가능합니다. 기능 소개: 1. 질문 쿼리: AI를 사용하여 질문에 대한 답변을 더 빠르게 찾을 수 있으며, 모든 종류의 질문을 할 수 있습니다. 2. 이미지 생성: AI를 사용하면 모든 사람에게 일반적인 요구 사항만 알려주면 됩니다. 3. AI 채팅: 사용자와 채팅할 수 있는 AI를 생성할 수 있으며,

vivox100s와 x100 휴대폰은 모두 in vivo 휴대폰 제품군의 대표적인 모델입니다. 두 휴대폰은 각각 서로 다른 시대의 vivo 첨단 기술 수준을 대표하므로 디자인, 성능, 기능 면에서 일정한 차이가 있습니다. 이번 글에서는 소비자들이 자신에게 꼭 맞는 휴대폰을 선택할 수 있도록 두 휴대폰을 성능비교와 기능분석 측면에서 자세히 비교해보겠습니다. 먼저 vivox100s와 x100의 성능 비교를 살펴보겠습니다. vivox100s에는 최신 기술이 탑재되어 있습니다.

인터넷의 급속한 발전으로 셀프미디어라는 개념은 사람들의 마음속에 깊이 뿌리내렸습니다. 그렇다면 셀프미디어란 정확히 무엇인가? 주요 특징과 기능은 무엇입니까? 다음에는 이러한 문제를 하나씩 살펴보겠습니다. 1. 셀프미디어란 정확히 무엇인가? We-media는 이름에서 알 수 있듯이 당신이 미디어라는 뜻입니다. 개인이나 팀이 인터넷 플랫폼을 통해 콘텐츠를 독립적으로 생성, 편집, 출판 및 전파할 수 있는 정보 매체를 말합니다. 신문, 텔레비전, 라디오 등과 같은 전통적인 미디어와 달리 셀프 미디어는 더욱 상호작용적이고 개인화되어 있어 모든 사람이 정보의 생산자이자 전파자가 될 수 있습니다. 2. 셀프미디어의 주요 특징과 기능은 무엇입니까? 1. 낮은 문턱: 셀프미디어의 등장으로 미디어 산업에 진출하기 위한 문턱이 낮아졌습니다. 더 이상 번거로운 장비와 전문팀이 필요하지 않습니다.

Xiaohongshu가 젊은이들 사이에서 인기를 끌면서 점점 더 많은 사람들이 이 플랫폼을 사용하여 자신의 경험과 인생 통찰력의 다양한 측면을 공유하기 시작했습니다. 여러 Xiaohongshu 계정을 효과적으로 관리하는 방법이 중요한 문제가 되었습니다. 이 글에서는 Xiaohongshu 계정 관리 소프트웨어의 일부 기능에 대해 논의하고 Xiaohongshu 계정을 더 잘 관리하는 방법을 살펴보겠습니다. 소셜 미디어가 성장함에 따라 많은 사람들이 여러 소셜 계정을 관리해야 한다는 사실을 깨닫게 되었습니다. 이는 Xiaohongshu 사용자에게도 어려운 과제입니다. 일부 Xiaohongshu 계정 관리 소프트웨어는 자동 콘텐츠 게시, 예약 게시, 데이터 분석 및 기타 기능을 포함하여 사용자가 여러 계정을 보다 쉽게 관리할 수 있도록 도와줍니다. 이러한 도구를 통해 사용자는 자신의 계정을 보다 효율적으로 관리하고 계정 노출과 관심을 높일 수 있습니다. 또한 Xiaohongshu 계정 관리 소프트웨어에는

"Discovering Discuz: 정의, 기능 및 코드 예제" 인터넷의 급속한 발전과 함께 커뮤니티 포럼은 사람들이 정보를 얻고 의견을 교환하는 중요한 플랫폼이 되었습니다. 많은 커뮤니티 포럼 시스템 중에서 중국의 잘 알려진 오픈 소스 포럼 소프트웨어인 Discuz는 대다수의 웹 사이트 개발자 및 관리자가 선호합니다. 그렇다면 Discuz는 무엇입니까? 어떤 기능이 있으며 웹사이트에 어떻게 도움이 됩니까? 이 기사에서는 Discuz를 자세히 소개하고 독자가 이에 대해 더 자세히 알아볼 수 있도록 구체적인 코드 예제를 첨부합니다.

PHP 팁: 이전 페이지로 돌아가는 기능을 빠르게 구현하세요. 웹 개발을 하다 보면 이전 페이지로 돌아가는 기능을 구현해야 하는 경우가 종종 있습니다. 이러한 작업은 사용자 경험을 향상시키고 사용자가 웹 페이지 간을 더 쉽게 탐색할 수 있게 해줍니다. PHP에서는 몇 가지 간단한 코드를 통해 이 기능을 구현할 수 있습니다. 이번 글에서는 이전 페이지로 돌아가는 기능을 빠르게 구현하는 방법을 소개하고 구체적인 PHP 코드 예제를 제공하겠습니다. PHP에서는 $_SERVER['HTTP_REFERER']를 사용하여 이전 페이지의 URL을 가져올 수 있습니다.

Linux에서 GDM의 기능 및 기능에 대한 자세한 설명 Linux 운영 체제에서 GDM(GNOMEDisplayManager)은 사용자가 시스템에 로그인 및 로그아웃할 수 있는 인터페이스를 제공하는 그래픽 로그인 관리자입니다. GDM은 일반적으로 GNOME 데스크탑 환경의 일부이지만 다른 데스크탑 환경에서도 사용할 수 있습니다. GDM의 역할은 로그인 인터페이스를 제공하는 것뿐만 아니라 사용자 세션 관리, 화면 보호기, 자동 로그인 및 기타 기능도 포함합니다. GDM의 기능은 주로 다음과 같은 측면을 포함합니다:

Linux 운영 체제를 사용하고 시스템이 부팅 시 드라이브를 자동으로 마운트하도록 하려면 장치의 고유 식별자(UID)와 마운트 지점 경로를 fstab 구성 파일에 추가하면 됩니다. fstab은 /etc 디렉터리에 있는 파일 시스템 테이블 파일입니다. 여기에는 시스템 시작 시 마운트해야 하는 파일 시스템에 대한 정보가 포함되어 있습니다. fstab 파일을 편집하면 시스템이 시작될 때마다 필요한 드라이브가 올바르게 로드되어 안정적인 시스템 작동을 보장할 수 있습니다. 드라이버 자동 장착을 통해 다양한 상황에서 편리하게 사용할 수 있습니다. 예를 들어, 내 시스템을 외부 저장 장치에 백업할 계획입니다. 자동화를 달성하려면 시작 시에도 장치가 시스템에 연결된 상태를 유지해야 합니다. 마찬가지로, 많은 애플리케이션이 직접적으로
