함수형 프로그래밍 - 안전한 합성

MyeonghoonNam·2021년 8월 14일
1

함수형 프로그래밍

목록 보기
8/10

함수형 프로그래밍 시리즈 내용으로 계속 이어서 내용이 진행되므로 처음 부터 포스팅을 확인해주세요.

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'),
 take(1),
 each(console.log)); // {name: "BB", age: 26}

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

보다 안전하면서 표현력이 좋은 코드 작성이 가능하다.

profile
꾸준히 성장하는 개발자를 목표로 합니다.

0개의 댓글