23.04.02 18:33 작성
·
449
·
수정됨
0
안녕하세요. 수업 중 이해를 잘 못한것 같아 질문 드립니다.
const value = [[1, 2], [3, 4], [6, 7, 8]];
L.flatMap = curry(pipe(
L.map,
L.flatten,
));
let it = L.flatMap(map(a => a * a), value)
log(...it)
위 코드가 돌아가는 과정을 한눈에 이해하기 어렵네요. 제가 생각한 흐름은 아래와 같은데 봐주실수 있을까요??
L.flatMap을 만든다. L.flatMap은 인자를 받을 준비를 하는 함수로 인자를 받으면 L.map과 L.flatten을 차례로 실행시켜 준다. L.flatMap의 내부 함수 pipe를 curry로 감싸긴 했지만 실행시 인자 2개를 같이 넣어줄 것이기 때문에 의미 없다.
L.flatMap을 실행시켜준다. 첫번째 인자로 map(a => a a) 두번째 인자로 value 값을 넣는다. 넣은 값은 L.map으로 간다. \
L.map과 L.flatMap의 인자로 들어온 인자(a => a a, value)는 L.map과 합성된다.
하지만 L.map 안에 log가 바로 찍히지 않는다. 왜냐면 제너레이터는 값이 필요해질 때(next()) 코드가 실행된다. 첫 번째 값이 필요 없다면 아예 실행되지 않고 map(a => a a)와 value가 들어간 상태로 대기?한다.
그 후 L.flatMap 함수를 평가해 값을 하나씩 가져오게 되면 L.flatten으로 가서 값을 만드려 하는데 iter 값이 없으므로 L.map으로 간다.
L.map 으로 가서 값을 만드는데 이터러블한 데이터를 하나 가져와서 3번에서 인자로 받은 map(a => a a)을 이용해 값을 다룬 후 yield로 보내준다.
차례대로 값을 가져온다.
다시 앞으로 돌아가서 천천히 복습해보는게 좋을까요? 아니면 일단 들어보면서 이해해보는게 좋을까요? 어렵지만 강의와 강의 내용은 너무 재밌습니다. 감사합니다.