개발 기술/함수형 프로그래밍

함수형 코드 만들기, 합성함수

by GicoMomg (Lux) 2021. 9. 26.

합성함수를 함수형 코드로 만들어보자! 이번에는 go(), map()을 이용한다.

합성함수 변형하기

A. 합성 함수 + map함수

: 우리는 함수형으로 합성 함수를 만들고자 한다.
: 먼저 f(x), g(x)를 map을 이용한 함수로 만든다.
: 그 다음, map으로 구성한 두 함수로 f(g(x))를 만든다.

const f = x => x + 10;
const g = x => x - 5;
const fg = x => f(g(x));

console.log(fg(10));  //15
console.log(fg())     //NaN

하지만,이 합성함수를 더 간단하게 표현하고 싶어!
go()를 사용해보자!


B. 합성 함수 + go()

go 함수를 앞선 챕터에서 설명했으나, 반복하면 기억하기 쉬우니 다시 설명을 적어본다 :)

go함수
- 인자를 받아 결과를 바로 산출함
- 첫번째 인자가 시작값.
- 두 번째 인자부터는 함수를 받음.
- 첫번째 인자가 두번째 함수의 매개변수로 작용하여 결과를 만들고
- 그 결과가 또 세번째 함수의 매개변수가 되어 결과를 만드는 과정을 수행

: 이제 go함수를 이용해 합성함수를 좀 더 함수형스럽게 만들어보자.

_.go(
  10,
  fg,
  console.log   //15
)  

앗! 그런데 앞선 코드 예시(A)에서는 인자를 넘기지 않으면 NaN이 출력되었다!
하지만 나는 인자가 없으면 아무것도 출력 시키고 싶지 않다...!
아래 방법을 보자


C. 합성 함수 + .each() & .map()

: 코드를 보기에 앞서, each(), map()함수에 대해 알아보자!

each(list, iteratee, [context])
- list: 값을 저장하는 공간 (ex. 배열, 객체)
- iterate: list의 각 요소를 반복적으로 돌리는 함수
- 각 요소가 함수의 인자로 작용하지만, 그 결과를 리턴하진 않는다.
- 함수 적용 결과를 보려면 console.log을 이용해 출력해야한다.
- 반복문이랑 비슷한 느낌이다.

map(list, iteratee, [context])
- list: 값을 저장하는 공간 (ex. 배열, 객체)
- iterate: list의 각 요소를 변형시키는 함수
- 함수에 의해 변형된 요소를 리턴한다.

앞선 두 함수의 공통점은 객체, 배열반복 가능한 객체가 주어져야 한다는 점이다.
이 말은 사용자가 빈 배열, 빈 객체를 주면 실행 조차 하지 않는다는 말이 될 수 있다.


: 결국, 인자가 없을 때 빈 값을 주려면 아래와 같이 두 함수를 사용하면 된다.

_.go (
  [],         //a. 빈 배열
  L.map(fg),  //b.인자가 없으니 map실행 x
  _.each(console.log)  //c.인자가 없으니 each 실행x

  //d. 결과적으로 출력하지 않음
)



출처

반응형

댓글