Skip to content
Underbleu
GithubLinkedin

3-3. findVal, every, some, none

Functional programming1 min read

프로그래머스에서 진행한 유인동님의 ES6로 알아보는 동시성 & 함수형 프로그래밍 강의를 들으며 정리한 내용입니다.

# find 계열 함수

  • findVal() - 원하는 값을 찾으면, 중간에 break
  • find() - 원하는 값을 찾으면, 그 값을 리턴

findVal() - 원하는 값을 찾으면, 중간에 break

원하는 값을 찾으면 중간에 멈추는 함수를 만드는 뼈대가 될 함수 (부모함수)이기 때문에, 비동기대응 가능하게 설계하면 이후에 자식함수들을 만들기 편해진다. 이 곳에서도 역시 undefined를 구분자로 사용한다

비동기 대응 -> 재귀, go()

  1. res가 프로미스인 경우 (Promies는 undefined가 아니라는 사실하에)
  2. go로 들어가서 프로미스에 값이 차있다면 그 값을 반환하고, undefined라면 다음 iter를 확인하기위해 재귀를 돈다
1const findVal = (f, coll) => {
2 const iter = collIter(coll)
3 return function recur(res) {
4 for (const a of iter) {
5 if((res = f(a)) !== undefined) {
6 return go(res, res => res !== undefined ? res : recur())
7 }
8 }
9 } ()
10}
11
12findVal(
13 a => Promise.resolve( a > 3 ? '있음' : undefined),
14 [1, 2, 3, 4, 5]
15).then(log) // 있음

find() - 원하는 값을 찾으면, 그 값을 리턴

find1(): 비동기 대응이 안됨 -> go를 활용하자 ! f(a)는 프로미스로 항상 undefined가 아니기 때문에 무조건 데이터의 첫번째 값을 리턴하는 오류가 생김

1/*
2const find1 = (f, coll) => findVal(a => f(a) ? a : undefined, coll) */
3const find = (f, coll) =>
4 findVal(a => go(a, f, bool => bool ? a : undefined), coll)
5
6log(find(a => a > 3, [1, 2, 3, 4, 5])) // 4
7log(find(a => Promise.resolve(a > 3), [1, 2, 3, 4, 5])) // 4

none() : 참인 값이 하나도 없는지 T/F

some() : 참인 값이 하나라도 있는지 T/F

1const isUndefined = a => a === undefined;
2const none = (f, coll) => go(find(f, coll), isUndefined);
3const some = (f, coll) => go(none(f, coll), not);
4
5log(some(a => a % 2, [2, 4, 5, 6])) // true
6log(none(a => a % 2, [2, 4, 5, 6])) // false

every(): 값이 모두 참인지 T/F

f -> negate(f) : none의 보조함수 반대로 뒤집기
해당되는 값이 있는지 -> 해당 안되는 값이 있는지

1const every = (f, coll) => go(find(negate(f), coll), isUndefined);
2
3log( every(a => a > 10, nums) ); // false
4log( every(a => a < 10, nums) ); // true