자바스크립트 함수형 프로그래밍 - curry

코더·2019년 1월 23일
1

data

<script>
  var users = [
      { name: "a", age:14 },
      { name: "b", age:31 },
      { name: "c", age:30 },
      { name: "d", age:35 },
      { name: "e", age:38 },
      { name: "f", age:40 },
      { name: "g", age:39 },
      { name: "h", age:41 },
      { name: "i", age:58 },
      { name: "j", age:48 },
      { name: "k", age:49 }
  ];
</script>

get

  • Array.prototype.forEach 기능 구현
<script>
   var _get = function (obj, key) {
        if (obj == null) { // obj === null or undefined
            return undefined;
        } else {
            return obj[key];
        }
    }
    // use
    _get(users, "name"); // undefined
    _get(users, 0);	// {name: "a", age: 14}

</script>

curry

  • 함수와 인자를 다루는 방법
  • 함수에 인자를 하나씩 적용해 나가다가 함수의 본체를 실행하는 기법
  • 자바스크립트에서는 커링이 지원되지 않지만 1급함수가 지원되고 평가시점을 마음대로 다룰수 있기 때문에 자바스크립트에서 구현가능하다
<script>
	// 1. curry
    function _curry(func) {
        return function (a, b) {
            if (arguments.length === 2) {
                return func(a, b);
            } else {
                return function (b) {
                    return func(a, b)
                }
            }
        }
    }
    // use
    var add = _curry(function (a, b) {
        return a + b;
    });
    console.log(add(10)(5));
    
    // 2. curryr
    function _curryr(func) {
        return function (a, b) {
            if (arguments.length === 2) {
                return func(a, b);
            } else {
                return function (b) {
                    return func(b, a);
                }
            }
        }
    }
    // use
    var sub = _curryr(function (a, b) {
        return a - b;
    });
    // console.log(sub(10, 5));
    // console.log(sub(10)(5));
</script>

응용

<script>
	var _get_curryr = _curryr(function (obj, key) {
        if (obj == null) { // obj === null or undefined
            return undefined;
        } else {
            return obj[key];
        }
    })
    // 40세 이상 이름 필터    
    var map1 = _map(
        _filter(users, function (item, index, list) {
            return item.age > 40;
        }),
        _get_curryr("name")
    );
    console.log(map1);
</script>

2개의 댓글

comment-user-thumbnail
2019년 5월 23일

안녕하세요. curry에 있는 _curry, _curryr 함수 안에 조건문은 왜쓰이는지 알고싶습니다.

1개의 답글