인프런 커뮤니티 질문&답변

ajrfyd님의 프로필 이미지
ajrfyd

작성한 질문수

자바스크립트로 알아보는 함수형 프로그래밍 (ES5)

커링, curry, curryr

_curryR 을 적용한 _map 혹은 _filter함수 질문입니다!!

작성

·

318

0

curryR을 활용해 등록한 map 함수나 _filter함수 동작에

 

const mapR = _curryR(_map);

 

console.log(

mapR(v => v.name)(arr) )

);

은 작동하는데 반해

 

console.log(

mapR(v => v.name, arr)

);

은 작동하지 않습니다...저는 조금 이해가 안가는게

 

arguments.length ===2 로 파라미터가 2개 들어올때

의 경우의 수 까지 처리 한것으로 알고 있는데 왜 밑에

부분은 작동하지 않는지...맞게 동작하는 것인지

궁금합니다....

만약 제가 놓치고 있는 부분이 있다면 알려주시면

감사드리겠습니다!

답변 4

1

유인동님의 프로필 이미지
유인동
지식공유자

mapR(arr, v => v.name); 이렇게 반대로 해보세요 :)

1

유인동님의 프로필 이미지
유인동
지식공유자

아 이 강의에서는 map 함수의 인자가 arr를 먼저 받도록 되어있고 curryR은 그 순서를 뒤집도록 되어있어서 그렇습니다 :)

ajrfyd님의 프로필 이미지
ajrfyd
질문자

말씀하신대로는 정상 작동 하는데 자꾸 질문 드려 죄송합니다 ㅠ

강의에서도 map 함수에 _curryr을 적용한 부분이 함수로 받은 인자를 먼저 받아 나중에 배열을 받아

함수를 유연하고 더 실용적인 함수로 사용할 수 있도록 _map = _curryr(_map); 이렇게 재 정의 한 뒤

위 말씀대로 먼저 받을 어레이를 뒤로 즉, 매핑함수를 먼저 받은 뒤 어레이를 받는 형식으로

제 코드 _mapR(v => v.name, arr); 요렇게 작동하는게 맞지 않은지요...ㅠ

_mapR(v => v.name)(arr); 요건 작동하고 바로위는 왜 작동 안하는지..제가 뭘 잘못 이해 하는지..

분명히 args.length === 2 ? fn(args[0], args[1]) : b => fn(b, args[0]); 을 통해

// CTO님 코드 return arguments.length === 2 ? fn(a, b) : function(b) return{ fn(b,a) };

mapR(v => v.name, arr)와 같이 인자가 한번에 두개가 들어 오더라도 동작할 수 있게 처리 했는데

왜 동작을 안하는 것인지.....이해가 가지 않네요...제가 뭔가 잘못 짚은 포인트가 있을까요ㅠㅠ

ajrfyd님의 프로필 이미지
ajrfyd
질문자

아 CTO님 제가 전체적인 부분을 못 본것 같네요??

arguments.length ===2 인 경우에는 파라미터의 위치를 바꾸지 않아서

(v => v.name, arr)인 경우는 작동하지 않는거죠?? 이게 제대로 이해 한게 맞는지 궁금합니다!

 

유인동님의 프로필 이미지
유인동
지식공유자

네 맞습니다 :)

0

ajrfyd님의 프로필 이미지
ajrfyd
질문자

코드입니다! 참고로 _curryR의 주석의 코드도 동작하지

않습니다. ㅠ

 

// 사용한 어레이 입니다.
const arr = [
  {
    id: 1,
    name: 'kim',
    age: 32,
  },
  {
    id: 2,
    name: 'Kang',
    age: 39,
  },
  {
    id: 3,
    name: 'Wong',
    age: 24,
  },
  {
    id: 4,
    name: 'Cha',
    age: 22,
  },
  {
    id: 5,
    name: 'Ku',
    age: 30
  },
  {
    id: 6,
    name: 'Lee',
    age: 29,
  },
  {
    id: 7,
    name: 'Choi',
    age: 42,
  },
  {
    id: 8,
    name: 'Chul',
    age: 29
  }
];

// each 함수 입니다.
function _each(list, itter) {  
 for(let i = 0; i < list.length; i++) {    
	 itter(list[i]);   
	}    
return list; 
};

//_map 함수 입니다.
function _map (list, mapper) {
  const newArr = [];
  _each(list, v => newArr.push(mapper(v)));

  return newArr;
};

//_filter함수 입니다.
function _filter (list, fn) {
  const newArr = [];
  _each(list, v => fn(v) ? newArr.push(v) : null);

  return newArr;
};

function _curryR (fn) {
  return (...args) => args.length === 2 ? fn(args[0], args[1]) : (b) => fn(b, args[0]);
  // return function(a, b) {
  //   return arguments.length == 2 ? fn(a, b) : function(b) { return fn(b, a); };
  // }
};

const _mapR = _curryR(_map);

const _filterR = _curryR(_filter);

console.log(
  _mapR(v => v.name)(arr), // 작동
  _mapR(v => v.name, arr)  // 타입에러
);


// TypeError: mapper is not a function 에러 내용 입니다.

0

유인동님의 프로필 이미지
유인동
지식공유자

동작해야할거 같은데 왜 안되는지는 잘 모르겠습니다 :)

사용하신 코드가 어떻게 될까요?

ajrfyd님의 프로필 이미지
ajrfyd
질문자

코드입니다! 참고로 _curryR의 주석의 코드도 동작하지

않습니다. ㅠ
// 사용한 어레이 입니다.
const arr = [
  {
    id: 1,
    name: 'kim',
    age: 32,
  },
  {
    id: 2,
    name: 'Kang',
    age: 39,
  },
  {
    id: 3,
    name: 'Wong',
    age: 24,
  },
  {
    id: 4,
    name: 'Cha',
    age: 22,
  },
  {
    id: 5,
    name: 'Ku',
    age: 30
  },
  {
    id: 6,
    name: 'Lee',
    age: 29,
  },
  {
    id: 7,
    name: 'Choi',
    age: 42,
  },
  {
    id: 8,
    name: 'Chul',
    age: 29
  }
];

// each 함수 입니다.
function _each(list, itter) {  
 for(let i = 0; i < list.length; i++) {    
	 itter(list[i]);   
	}    
return list; 
};

//_map 함수 입니다.
function _map (list, mapper) {
  const newArr = [];
  _each(list, v => newArr.push(mapper(v)));

  return newArr;
};

//_filter함수 입니다.
function _filter (list, fn) {
  const newArr = [];
  _each(list, v => fn(v) ? newArr.push(v) : null);

  return newArr;
};

function _curryR (fn) {
  return (...args) => args.length === 2 ? fn(args[0], args[1]) : (b) => fn(b, args[0]);
  // return function(a, b) {
  //   return arguments.length == 2 ? fn(a, b) : function(b) { return fn(b, a); };
  // }
};

const _mapR = _curryR(_map);

const _filterR = _curryR(_filter);

console.log(
  _mapR(v => v.name)(arr), // 작동
  _mapR(v => v.name, arr)  // 타입에러
);


// TypeError: mapper is not a function 에러 내용 입니다.
ajrfyd님의 프로필 이미지
ajrfyd

작성한 질문수

질문하기