>웹 프론트엔드 >JS 튜토리얼 >JavaScript 함수형 프로그래밍의 Curry 구현

JavaScript 함수형 프로그래밍의 Curry 구현

黄舟
黄舟원래의
2017-03-02 14:53:091425검색

최근 JavaScript 함수형 프로그래밍을 배우고 있는데, 그 유명한 카레에 관심이 많습니다. 카레 함수는 함수를 받을 수 있는데, 일단은 원래 함수라고 부르자. 함수, curried 함수, 반환된 curried 함수는 실행 과정에서 원래 함수의 실행 조건이 트리거될 때까지 전달된 매개변수를 저장하는 함수를 지속적으로 반환합니다. 이것은 더 일반적이므로 설명하기 위해 예를 들어보겠습니다.

원래 함수:

var add = (x, y) => x + y

Curried 함수:

 var curryAdd = curry(add)

이 추가에는 두 개의 매개변수가 필요하지만 curryAdd 실행은 전달된 매개변수가 add에 필요한 매개변수보다 작으면 curryAdd는 매개변수를 기록하고 다른 함수를 반환합니다. 들어오는 매개 변수를 기록하는 변수가 있습니다. 들어오는 매개 변수의 총 개수가 추가에 필요한 총 매개 변수 개수와 같으면 원래 매개 변수 실행을 활성화하고 원하는 결과를 반환합니다.

// 此时只传入了一个参数 根据判断返回的是一个函数
    var add2 = curryAdd(2)
    // add2 = function(...) {}
// 此时累计传入了两个参数 等于了add需要参数的总和 所以返回的是一个结果
    // 相当于执行了add(2)(3)
    var result = add2(3)
    // result = 5

꽤 괜찮죠? 음, 우리의 목표는 이 마법의 카레 함수를 작성하는 것입니다. 걱정하지 말고 먼저 작성하는 방법을 분석한 다음 진행하세요. 단계별 최적화.

위의 설명에 따라 카레 함수에 무엇이 필요한지 살펴보겠습니다. 먼저 원래 함수의 매개변수 개수를 저장하는 변수가 필요합니다. 그게 다입니다.

    var curry = function(fn) {
         var limit = fn.length
         ...
    }

curry 함수는 함수를 반환해야 하며, 이 함수가 실행되어야 합니다. 문제는 이 함수의 실행이 활성화되는지 여부를 결정해야 한다는 것입니다. 위의 매개변수가 들어오는 경우 문제가 발생합니다. 함수 또는 결과를 반환합니까? 이는 실제로 문제가 됩니다. 전달된 매개변수가 원래 함수에 필요한 매개변수와 동일하면 원래 함수 fn

    var curry = function(fn) {
         var limit = fn.length
         return function (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             }
         }
    }

를 실행해야 합니다. 함수, 여기에는 두 가지 점이 있습니다. 하나는 전달된 매개변수의 기록을 기록해야 한다는 것이고, 다른 하나는 반환된 함수가 수행해야 하는 작업입니다.

    var curry = function(fn) {
         var limit = fn.length
         return function (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             } else {
                 return function(...args2) {

                 }
             }
         }
    }

보세요. 반환된 함수 실행의 매개변수를 축적하면 됩니다. 이는 전달된 매개변수를 기록하는 목적을 달성하므로 args.concat(args2)에 대한 연결을 생각하는 등 우리가 반환하는 함수는 다음과 같습니다. 위의 내용을 반복합니다. 즉, args 매개변수가 있는 함수는 무엇을 해야 하므로 이름이 필요합니다. 그렇지 않으면 실행할 수 없으며 이를 JudgeCurry라고 부릅니다.

우리가 말했듯이, 함수를 반환하거나 원래 함수를 실행합니다.

    var curry = function(fn) {
         var limit = fn.length
         return function judgeCurry (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             } else {
                 return function(...args2) {
                     return judgeCurry.apply(null, args.concat(args2))                                     
                 }
             }
         }
    }

드디어 이 마법의 카레 기능을 작성했습니다. Compose와 결합하면 정말 멋집니다.

위 함수를 한 줄, 한 줄로 작성하는 것이 우리의 목표인가요? 작성하는 방법? 그런데 ES6를 사용하다보니 시간이 많이 걸렸네요

var currySingle = fn => judgeCurry = (...args) => args.length >= fn.length ? fn.apply(null, args) : 
(...args2) => judgeCurry.apply(null, args.concat(args2))

자, 뭐가 문제인지 살펴보겠습니다. 그런데 Limit 매개변수를 사용하지 않기 위해서는 다음과 같은 경우에 값을 할당해야 합니다. 한 줄에 할당을 할 수는 없습니다.

    var currySingle = fn => {
        var limit = fn.length
        var judgeCurry = null
        return judgeCurry = (...args) => args.length >= limit ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2))
    }

매개변수를 판단해야 할 때 fn.length를 지속적으로 평가하지만 fn.length의 값은 확실합니다. 매번 평가하고 싶지는 않지만 한계를 사용하고 싶지도 않습니다. 예, 무엇을 할 수 있습니까? 함수를 즉시 실행하려고 생각하셨을 겁니다! !

아아아아

자바스크립트의 마법에 한숨이 나옵니다. 드디어 이 마법의 카레를 한 줄로 썼습니다.

위 내용은 JavaScript 함수형 프로그래밍에서의 카레 구현 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.