함수형 프로그래밍 시리즈 내용으로 계속 이어서 내용이 진행되므로 처음 부터 포스팅을 확인해주세요.
다음과 같은 합성함수를 선언했다.
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을 통해 선언했을때, 인자값으로 잘못된 값이 들어왔을때, 아무동작을 하지 않음을 알 수 있고, 그대로 빈 배열이 반환 되므로 안전한 함수합성이 이루어졌음을 알 수 있다.
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'),
take(1),
each(console.log)); // {name: "BB", age: 26}
/* 찾는 값이 없을 경우 */
go(users,
L.filter(u => u.name == 'FF'),
take(1),
each(console.log)); //
보다 안전하면서 표현력이 좋은 코드 작성이 가능하다.