2

나는 지난 며칠 동안 부분적인 응용과 카레를 조사 해왔다.몇 가지 별개의 인수가 아닌 옵션 객체를 인수로 사용하는 함수를 카레하는 방법은 무엇입니까?

하나의 options 개체를 인수로 사용하는 함수에서 어떻게 이러한 개념을 사용할 수 있을지 궁금합니다.

const myFunc = options => { 
    const options.option1 = options.option1 || 'default value'; 
    const options.option2 = options.option2 || 'another default value'; 
    // ... etc, it takes about 5 more options, all of which have a 
    // default fall-back value if not supplied 

    return doSometing(options); 
} 

는이 경우, 나는 myFunc 서명을 변경 기분과는 옵션을 제공해야하는 순서를 기억하는 고통 때문에 별도의 인수로 모든 옵션을 전달하지 않습니다.

저는 기능적 스타일을 고수하고 객체를 인스턴스화하지 않으려면 new ... 상태를 유지하는 것이 좋습니다. 나는 이것이 부분적인 적용으로 달성 될 수있는 직감이있다. 테스트하거나 인스턴스화 할 때보다 간단하게 유지합니다.

그러나 그렇다면 별도의 인수없이 부분적으로 응용 프로그램을 올바르게 수행하는 방법을 알지 못합니다.

어떻게이 리펙터를 처리 하시겠습니까?

+0

인자가 하나뿐이라면 카레를 쓸 일이 없습니다 ... – elclanrs

+0

[명시 적으로 변경 될 때까지 설정을 유지할 수 있습니까?] (http://stackoverflow.com/questions/43466657/can- we-set-persistent-default-parameters- 어느 쪽이 명시 적으로 변경 될 때까지) – guest271314

+0

@elclanrs : 물론입니다. 이것은 부분적으로 적용되는 다른 흥미로운 형태 일 것입니다. –

답변

3

옵션 개체를 사용하는 함수를 currying하는 것과 동일한 것은 기본값을 처리하는 방법과 같을 것이라고 제안합니다. 당신이 options에있는 사람들에 의해 무시 될 수없는 myOptions의 옵션을 원한다면 단순히이

+0

그리고 기본값이 없으므로 필요한 몇 가지 옵션 속성이있는 경우 필요한 속성의 이름 목록을 제공하거나 호출을 알리는 값을 사용하여 'myOptions'에 포함시켜 확장 할 수 있습니다 그것들이없는 객체는 불완전하다. (값이 될 수 없다면'undefined '가 가능하고,'myFuncWithMyOptions'에'Symbol'이 붙는다.) 불완전한 객체가 보내지면, 원래 함수의 새롭게 포장 된 버전을 반환 할 수있다. 확장 된 기본값 집합 및 감소 된 필수 필드 집합이 포함됩니다. –

+0

@ScottSauyet 예, 호출이 빨리 실패하기 때문에 디버깅이 더 쉬워 질 수 있습니다. 그러나 그 효과는 변하지 않을 것입니다. –

+0

글쎄, 나는 이것이 다른 형태의 부분 적용처럼 작동 할 것이라고 생각했다. 필요한 모든 매개 변수를 제공하지 않으면 이전 옵션과 기본값을 병합하고 원래 함수를 호출하는 새 함수를 얻습니다 (이제는 필요한 모든 매개 변수를 제공했다고 가정 함). .) –

1

Object.assign 댄 D의 답변과 의견을 다음에 두 개의 인수를 교환

myFuncWithMyOptions(myFunc, myOptions) { 
    return function(options) { 
    return myFunc(Object.assign({}, myOptions, options)); 
    } 
} 

: 부분 적용자로서 이것을 고려 기술을 사용하면 필요한 모든 필드가 제공 될 때까지 부분적으로 이러한 함수를 반복적으로 적용 할 수 있습니다.

1

문제가 부분 적용과 관련되어 있다고 생각하지 않습니다. 엔. 정확히 myFunc은 실제로 무엇을합니까?

  • 는 그것이이 훨씬 아닌 다른 함수

를 호출

  • 옵션 기본 값의 몇 가지를 설정합니다. 그럼에도 불구하고 두 가지 문제가 발생한다 : 함수 조성물은 하드 코딩 및 myFunc
  • 의 몸에 숨겨져

    • 가 디폴트 값은 간단하게

  • 을 덮어 함수 서명에서 분명하지 않습니다 "적절한"기능은 서명으로 기능을 나타냅니다. 그래서이 myFunc 래퍼를 제거하자

    const options = { 
     
        foo: 1, 
     
        bar: true, 
     
        bat: "", 
     
        baz: [] 
     
    }; 
     
    
     
    // function composition 
     
    
     
    const comp = (...fs) => x => fs.reduceRight((acc, f) => f(acc), x); 
     
    
     
    // applicator for partial application with right section 
     
    
     
    const _$ = (f, y) => x => f(x) (y); // right section 
     
    
     
    // `Object` assignment 
     
    
     
    const assign = o => p => Object.assign({}, o, p); 
     
    
     
    // specific function of your domain 
     
    
     
    const doSomething = o => (console.log(o), o); 
     
    
     
    // and run (from right-to-left) 
     
    
     
    comp(doSomething, _$(assign, {baz: [1, 2, 3], bat: "abc"})) (options);
    지금 정확히 함수 기관에보고하지 않고 무슨 일이 일어나고 있는지 볼 수 있습니다. Object 옵션의 부동산 주문은 중요하지 않습니다.

    _$에 대한 의견. 이 특별한 경우에 텍스트보다 시각적 인 이름을 선호하기 때문에이 이름이 이상합니다. sub = x => y => x - y, _$(sub, 2)은 단순히 x => x - 2을 의미합니다. 이것은 "왼쪽"인수가 여전히 누락되어 부분적으로 적용된 sub 함수의 오른쪽 섹션이라고합니다.

    관련 문제