marpple/partial.js

다음 코드에서 _.partial 함수가 정상 작동하지 않습니다.

Closed this issue · 2 comments

안녕하세요. 책을 스터디 하던 중 다음 코드가 작동 되지 않아 문의 드립니다.
_.find_where함수 부분에서 결과값이 undefined가 떨어집니다. partial적용 하기 전에는 정상적으로 값이 출력되었고요.

최신 버전으로 update해도 나타나는 문제입니다. 확인 부탁드립니다 :)

_.is_match = _.every(function(a, b_val, b_key) { return a[b_key] === b_val; });
// 부분 커링 + predicate 에게 인자 더 넘기기

_.find_where = function(list, attrs) {
return _.find(list, (.is_match, _, attrs));
};
console.log(
_.find_where([{ id: 1, name: "ID" }, { id: 2, name: "CJ" }], { id: 1 })
);
// { id: 1, name: "ID" } => undefined가 떨어집니다.

console.log(
_.is_match({ id: 5, name: "PJ" }, { id: 5 })
);
// true

function find_where (coll, attrs) {
return .find(coll, __(.identity, _.partial(is_matched, _, attrs)))
}

이렇게 pipe와 identity를 이용해서 해결했습니다.
partial을 적용한 iterator의 " _ " 자리에 find가 3개의 parameter를 넘겨주면 1개의 parameter가 "_"에 채워지고 나머지 2개의 parameter는 attrs 뒤에 자동으로 채워져서 (1st, attrs, 2nd, 3rd) 형태가 되어서 생긴 문제였습니다.

자동 커링된_.every함수에는 (1st, attrs)형태로 2nd, 3rd가 제거된 상태로 parameter가 넘어가야 했기 때문입니다.
지금같은 상황에서는 _.partial을 적용한 함수에는 채워지고 남은 parameter가 자동으로 제거되도록 할 필요가 있다고 생각되는데 그것이 상황에 따라 필요한 case라면 option으로 처리하는 것도 괜찮을 듯 합니다.

혹시 제가 놓친 더 나은 방법이 있다면 조언 부탁드립니다 :) 감사합니다

아 그렇네요! 해결도 잘하셨고 말씀주신 아이디어도 좋은거 같습니다. 새로 만들고 있는 버전에서 해당 부분들 고민 잘해서 적용해보겠습니다.