이전 기사에서는 javascript
함수형 프로그래밍에서 curry
(커링) 구현을 소개했습니다. 물론 그 커링은 제한된 매개변수가 생기면 시도해 보겠습니다. 무한한 매개변수를 추가하는 일종의 커링입니다. 이번에는 함수형 프로그래밍에서 또 다른 매우 중요한 함수인 javascript
에 대해 주로 이야기하겠습니다. compose
함수의 역할은 함수를 연속적으로 결합하는 것입니다. 여러 함수. 한 함수의 출력은 다른 함수의 입력 매개변수가 됩니다. 첫 번째 함수가 실행되기 시작하면 실행이 도미노처럼 추론됩니다. compose
, firstName
로 구성되며, 모두 이름을 출력합니다. 예를 들어 lastName
, jack
를 입력하면 smith
로 출력됩니다. ‘HELLO,JACK SMITH’
, greeting
toUpper
var greeting = (firstName, lastName) => 'hello, ' + firstName + ' ' + lastName var toUpper = str => str.toUpperCase() var fn = compose(toUpper, greeting) console.log(fn('jack', 'smith')) // ‘HELLO,JACK SMITH’요약하면 주목해야 할 점은 다음과 같습니다. 다음 몇 가지 사항:
의 매개변수는 함수이고, 반환되는 것도 compose
이고, 의 허용값은 多元
입니다. 다른 함수는 一元
compsoe
입니다. 이 함수는 모든 매개 변수를 사용할 수 있으며, 실행 방향은 自右向左
입니다. 最右面
이 세 가지 사항을 알고 나면 앞선 예제의 실행 과정을 쉽게 분석할 수 있습니다. 실행 결과는 fn('jack', 'smith')
에 매개변수로 전달되고, greeting
이 실행되어 최종 결과를 얻는데, Compose의 장점을 간단히 언급하자면, 처리 기능을 추가할 필요가 없습니다. toUpper
을 수정하려면 toUpper
만 실행하면 됩니다. 예를 들어 다른 fn
을 추가하려면 compose
var trim = str => str.trim() var newFn = compose(trim, fn) console.log(newFn('jack', 'smith'))
trim
만 하면 됩니다. 유지하고 확장하는 것이 매우 편리합니다.
구현
함수형 프로그래밍의 두 가지 주요 라이브러리인 compose
과 javascript
가 어떻게 구현되는지 다시 살펴보세요. lodash.js
의 구현 프로세스는 매우 기능적입니다. ramda.js
ramda.js
내 구현
매개변수의 길이를 기록하고 반환된 함수에 compose
라는 이름을 추가합니다. compose
var compose = function(...args) { var len = args.length return function f1() { } }
len
함수 본문에서 해야 할 일은 f1
에 있는 함수를 계속 실행하고, 이전 함수의 실행 결과를 다음 실행 함수의 입력 매개변수로 사용하는 것입니다. > 기능 목록 실행을 기록하기 위해 필요합니다. var compose = function(...args) { var len = args.length var count = len - 1 var result return function f1(...args1) { result = args[count].apply(this, args1) count-- return f1.call(null, result) } }
args
물론 이것은 불가능합니다. 재귀적 종료 조건은 마지막 함수가 실행될 때, 즉 count
가 args
일 때입니다. 이때 주의할 점은 재귀적으로 종료되면 커서가 초기 상태로 돌아가야 한다는 점입니다. 마지막으로 var compose = function(...args) { var len = args.length var count = len - 1 var result return function f1(...args1) { result = args[count].apply(this, args1) if (count <= 0) { count = len - 1 return result } else { count-- return f1.call(null, result) } } }
count
코드를 추가하여 이 0
함수를 구현합니다. 나중에 반복을 사용하면 재귀를 완전히 구현할 수 있다는 것을 알게 되었습니다. 실제로 count
함수를 사용하면 이해하기 더 쉬운 것 같습니다.
compose
while
lodash.js
var flow = function(funcs) { var length = funcs.length var index = length while (index--) { if (typeof funcs[index] !== 'function') { throw new TypeError('Expected a function'); } } return function(...args) { var index = 0 var result = length ? funcs[index].apply(this, args) : args[0] while (++index < length) { result = funcs[index].call(this, result) } return result } } var flowRight = function(funcs) { return flow(funcs.reverse()) }
lodash
보실 수 있습니다. 의 구현이지만 추가 기능 검증 계층과 함께 lodash
의
이 아니라 lodash
이고, 이 从左到右
줄에서 배열이 비어 있어도 된다는 것을 알 수 있으며, 매우 엄격하다는 것을 알 수 있습니다. 내가 작성한 내용에는 이러한 엄격한 예외 처리가 부족했습니다. 从右到左
flowRight
결론数组
参数序列
이번에는 함수형 프로그래밍에서 var result = length ? funcs[index].apply(this, args) : args[0]
함수의 원리와 구현 방법을 주로 소개했습니다. 지면 관계로 제가 계획하고 있는
위 내용은 JavaScript 함수형 프로그래밍에서 compose로 구현한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!