본문 바로가기

Web[웹]/ES6+ 함수형 언어

[ES6+: 응용] map과 filter로 하는 안전한 함수 합성

 

#1 안전한 함수 합성

 

map으로 합성하기

 

다음과 같은 합성함수를 선언했다.

 

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

 

위와 같이 함수를 선언했을 때, 아래와 같이 인자값 없이 값을 실행하면 'NaN'으로 에러가 난다.

 

console.log(fg(10)); // 15
console.log(fg()); // NaN - 에러가 난다.

 

잘못된 값이 들어왔을때, 아무 동작도 하지 않게끔 하려면 어떻게 해야될까? 바로 모나드와 map함수를 통해 안전한 합성을 이룰 수 있다.

 

위와 똑같은 동작을 하는 함수를 go 함수를 통해 나타내보자.

 

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

 

이제, 이것을 안전한 함수 합성을 위해여 모나드와 map을 통해 코드를 구성할 것이고, 이것들의 값이 있을때와 없을때 동작을 확인하여보자.

 

_.go(
   [],
   L.map(fg),
   _.each(console.log)); //
    
_.go(
   [10],
   L.map(fg),
   _.each(console.log)); // 15

 

위 처럼 모나드와 map을 통해 선언했을때, 인자값으로 잘못된 값이 들어왔을때, 아무동작을 하지 않음을 알 수 있고, 이로 안전한 함수합성이 이루어졌음을 알 수 있다.

 

 


 

find 대신 L.filter 사용하기

 

다음과 같은 데이터가 있다.

 

const users = [
    { name: 'AA', age: 35 },
    { name: 'BB', age: 26 },
    { name: 'CC', age: 28 },
    { name: 'CC', age: 34 },
    { name: 'EE', age: 23 },
];

 

이 데이터에서 유저를 찾을때, 만약 찾는 유저가 없을 경우에는 다음과 같은 에러가 난다.

 

const user = _.find(u => u.name == 'FF', users);
console.log(user); // undefined

 

이 때는, if문을 이용해서 유저가 없을땐 출력하지 않도록 아래와 같이 구성할 수 있다.

 

const user = _.find(u => u.name == 'FF', users);
if(user) console.log(user); //

 

하지만, 위와 같이 에러가 발생했을때, 따로 if문을 통해 처리할 필요 없이 안전하게 출력이 되게끔 하려면 어떻게 해야될까? 바로 L.filter를 이용해서 안전한 함수 합성을 이루면 된다.

 

/* 찾는 값이 있을 경우 */
_.go(users,
   L.filter(u => u.name == 'BB'),
   L.take(1),
   _.each(console.log)); // {name: "BB", age: 26}

------------------------------------------------

/* 찾는 값이 없을 경우 */
_.go(users,
   L.filter(u => u.name == 'FF'),
   L.take(1),
   _.each(console.log)); //