3-3. findVal, every, some, none
— Functional programming — 1 min read
프로그래머스에서 진행한 유인동님의 ES6로 알아보는 동시성 & 함수형 프로그래밍 강의를 들으며 정리한 내용입니다.
# find 계열 함수
findVal()
- 원하는 값을 찾으면, 중간에 breakfind()
- 원하는 값을 찾으면, 그 값을 리턴
findVal()
- 원하는 값을 찾으면, 중간에 break
원하는 값을 찾으면 중간에 멈추는 함수를 만드는 뼈대가 될 함수 (부모함수)이기 때문에, 비동기대응 가능하게 설계하면 이후에 자식함수들을 만들기 편해진다. 이 곳에서도 역시 undefined를 구분자로 사용한다
비동기 대응 -> 재귀, go()
- res가 프로미스인 경우 (Promies는 undefined가 아니라는 사실하에)
- 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])) // 47log(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])) // true6log(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) ); // false4log( every(a => a < 10, nums) ); // true