함수형 프로그래밍과 JavaScript ES6+

함수형 프로그래밍과 JavaScript ES6+

(21개의 수강평)

706명의 수강생

55,000원

평생
초급, 중급
수료증
71개 수업, 총 8시간 7분
위시리스트 추가
Einere 프로필

async/await를 이용할 수는 없나요? Einere 1달 전

L.reduce를 async함수로 리팩토링하려고 하고 있습니다.

다음은 제가 구현한 코드입니다.

L.filter = L.curry(function* (f, iterable) {
    // for (const e of iterable) if (f(e)) yield e;
    for (const e of iterable) {
        const result = L.branch(e, f);
        if (result instanceof Promise) yield result.then((val) => val ? e : Promise.reject(L.nop));
        else if (result) yield e;
    }
});

L.reduce = L.curry(async (f, acc, iter) => {
    if (!iter) {
        iter = acc[Symbol.iterator]();
        acc = await iter.next().value;
    }

    for (const e of iter) {
        try {
            acc = await f(acc, await e);
        } catch (err) {
            if (err === L.nop) acc = await f(acc, e);
            if (err !== L.nop) return Promise.reject(err);
        }
    }

    return acc;
}) 

위 코드를 이용해 영상의 예제를 다음과 같이 실행하면 결과가 다음과 같이 나옵니다.

const L = require("./myUtils.js");

L.go(
    [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3), Promise.resolve(4), Promise.resolve(5), Promise.resolve(6)],
    L.filter(val => !(val % 2)),
    L.reduce((acc, val) => acc + val),
    console.log
).catch(console.log);

// 출력 : 2[object Promise]4[object Promise]6

  어떻게 수정하면 좋을까요..?

 

 

1
pulp fiction 프로필

Go Function은 항상 구현하여 사용해야하는 함수인가요? pulp fiction 1달 전

go Function은 Iterator 객체나 특정 객체에 Prototype에 전혀 들어가지 않고 항상 따로 구현해야하는 함수인가요?

1
Jade Stern 프로필

파이어폭스에서는 L.range가 더 느리게 나오는데 혹시 그 이유가 있을까요? Jade Stern 1달 전

왼쪽이 파이어폭스, 오른쪽이 크롬입니다.

 

 

 

1
oscar 프로필

3개 이상의 인자가 있는 함수의 경우 처리 oscar 1달 전

지금 구현한 curry 는 3개 이상의 인자가 있을 때, 첫 번째 인자만 고정하고, 나머지 인자를 한 번에 넘겨서 호출해야만 처리가 가능한데요. 이게 의도하신건가요? 원래 커링은 여러 개의 인자가 있을 때, 변수를 하나 씩 고정하는 함수열로 만드는 거라고 알고 있어서요. 

예를 들어, const test = curry((a,b,c) => a+b+c) 에서 console.log(test(1)(2)) 하면 NaN 이 나옵니다. 

1
Woo  Sangin 프로필

안녕하세요 Woo Sangin 2달 전

질문이 있는데..

파이참 쓰시는거 같은데 혹시 파이참에서 컨솔창 어떻게 여는지 알려주실수 있을까요?

감사합니다..

1
후리덤 프로필

a instanceof Promise 후리덤 2달 전

fxjs 와 mql 를 애용하는 개발자입니다.

 

최근 사용한 어떤 모듈에서 parameter 수에 따라 비동기 처리에 대한 응답을

callback 패턴과 Promise 패턴 모두 지원하는 함수가 있었습니다.

 

go 함수를 통해 값을 다루어왔기 때문에 당연히 Promise 패턴을 생각하고 코딩을 했습니다.

그런데 예상과는 다르게 동작했고, 무엇보다 go 함수 결과에 catch 메소드 자체가 존재하지 않았습니다.

 

알고보니 해당 모듈의 함수에서 bluebird Promise 를 사용하고 있어서

fxjs 내부의 a instanceof Promise 부분에 걸려들지 않았던 것입니다.

그래서 메소드 전체를 new Promise 로 감싸고 callback 함수에서 resolve/reject 처리하여 진행하였습니다.

 

그런데 문득, Promise 값인지 아닌지를 판단하는 a instanceof Promise 부분까지도,

함수로 받게끔 할 수 있다면 어떨까 하는 생각이 들었습니다.

is_promise = a => a instanceof Promise

대신 is_promise = a => a instanceof Promise || a instanceof blue_bird_Promise

 

물론 함수를 사용할 때마다 해당 함수를 넘기는 것이 아니라,

fxjs 내부에 is_promise = a => instanceof Promise 부분은 이미 정의되어 있고,

fxjs 초기 설정시 is_promise 함수를 다른 함수로 대체하여 사용할 수 있도록 허용하는 것을 의미합니다.

1
Younghwan Nam 프로필

function* 없이 지연성이 있는 함수를 만들 수 있을까요? Younghwan Nam 2달 전

주어지는 generator기능이 없이, generator와 동일한 역할을 수행하는 함수를 코드로 보고 싶습니다.

2
Jade Stern 프로필

사운드 싱크가 안맞는 것 같습니다.. Jade Stern 2달 전

저만 그런건가요?

6
아로마홈키퍼 프로필

products가 사라져도 왜 괜찮은지 모르겠어요.... 아로마홈키퍼 2달 전

curry 함수에 의해서

products =>filter(p=>p.price <20000, products) 가 products ⇒ filter(p⇒p.price <2000)(products) 가 되는 것은 이해하였습니다. 다만 어째서

products ⇒ filter(p⇒p.price <2000)(products) 가

filter(p⇒p.price <2000) 랑 같은 것인지는 이해가 되지 않습니다.

모양 자체도 (인자) ⇒ (실행할 함수) 의 모양에서 아예
(함수) 의 모양으로만 바뀌었는데, 이렇게 될 경우 인자를 주지도 않고 작동하는 함수? 처럼 보입니다.

혹시 go 함수의 reduce 함수 자체가 이미 f(acc, a)를 할때 f(products, filter(....)) 와 같은 모양이 되기에 그런것일 까요?

3
아로마홈키퍼 프로필

pipe 함수 인자관련 질문있습니다 아로마홈키퍼 2달 전

const pipe = (...fs) => (a) => go(a, ...fs);

const f = pipe(

a => a+1,

a=> a+10,

a=> a+100

)

 

f(0)

이 부분에서 질문이 있습니다.

1. f 함수는 어떻게 0이라는 파라미터를 받을 수 있는가?

- pipe 함수 자체가 ...fs를 파라미터로 받기에 가능한 것인가요?

2. pipe 함수에서의 (a)가 어떻게 f(0)에서의 0으로 연결되는지 이해가 잘 안됩니다. 

f(0) = pipe(...fs)(0) 이렇게 되는 건가요?

1
류명한 프로필

go, pipe, reduce의 비동기 제어에서의 성능 개선에 대한 질문입니다. 류명한 2달 전

go, pipe, reduce의 비동기 제어 부분에서 reduce함수를 recur(acc)를 리턴하는 방식으로 고치면

go(1, a => a + 10, Promise.resolve(a + 100), a => a + 1000, a => a + 10000)에서 a => a + 10과 a => a + 1000, a => a + 10000이 하나의 콜스택에서 동작하기 때문에 성능적으로 더 좋고 효율적으로 동작하는 reduce가 된다고 설명해주셨는데요. 

혹시 이 부분을 조금만 더 자세히 설명해주실 수 있을까요? 아직 자바스크립트에서의 비동기 실행에 대한 이해가 부족한 탓인지, 아니면 혹시 이벤트루프에 대한 이해가 부족한 탓인지 이 부분이 잘 이해가 되지 않네요. 

감사합니다. 

1
류명한 프로필

혹시 3편은 언제쯤 나올지 알 수 있을까요? 류명한 3달 전

안녕하세요. 

좋은 강의 올려주셔서 진심으로 감사드립니다. 

강의를 하나씩 들을 때마다 함수형 프로그래밍을 통해 가능해지는 코드의 간결함과 효율성에 매번 감탄하면서 듣고 있는데요. 지금 듣고 있는 강의를 얼른 듣고 소화시키고 더 깊게, 더 효과적으로 응용하고 싶은 욕심이 많이 드는 것 같습니다. 

현재 응용편까지 나와있고 3편은 데이터베이스와 관련된 강의가 될 것이라고 들었는데, 혹시 3편은 언제쯤 출시가 될지, 그리고 데이터베이스와 관련해서 좀 더 구체적으로 어떤 내용의 강의가 될지 미리 조금만 알려주실 수 있을까요? 

감사합니다. 

1
주홍철 프로필

전체적인 질문있습니다..! 주홍철 3달 전

질문

1. 모나드와 try-catch

유인동개발자님께서는 Promise를 쓰시면서 안전하게 값을 래핑하여 모나드를 하셨는데 문득 try catch로 하면되잖아? 라는 생각이 들어서 더 모나드를 공부했고 정리한 내용입니다. 혹시 이게 맞는지 확인좀 부탁드립니다. 

 

정리한 내용

`try catch`를 쓰게 되면 로직을 담고 있는 컨테이너의 벨트의 라인이 2개로 분리되어 투명성을 잃게 된다. 물론 `try catch`를 써서 애러처리를 할 수도 있지만 함수형 프로그래밍에서는 컨테이너라는 안전한 박스에 담아 실행을 하는게 좋다. 

 

2. 프로미스의  순서문제

```js

const log = console.log

const users = [{name : '큰돌'}, {name : '제호'}, {name : '우람'}, {name : '다빈'}] 

const getUserByName = (name) => users.find(u => u.name === name) || Promise.reject("객체에 없습니다.")

const g = getUserByName;

const f = ({name}) => `${name}이가 춤을 춥니다.`

const fg = x => new Promise((resolve, reject)=> resolve(x)).then(g).then(f) 

fg("큰돌1").catch(_ => _).then(log)

//객체에 없습니다.

 

fg("큰돌").catch(_ => _).then(log)

// 큰돌이가 춤을 춥니다.

 

/*

큰돌이가 춤을 춥니다.

객체에 없습니다.

*/

```

선생님께서 만드신 예제를 변형해서 공부를 하고 있던 도중 이런 순서적인 질문이 생겼는데요. 

분명 객체에 없습니다가 먼저 떠야 하는데 춤을 춥니다가 먼저 뜨는 이유는 객체에 없는 경우 catch까지 실행을 해서 조금 더 느리게 발생이 되고 춤을 춥니다의 경우 catch를 실행하지 않기 떄문에 실행이 조금 더 빠른 것이 맞나요?  

 

2
주홍철 프로필

모나딕한 이라는 것이 무엇인가요? 주홍철 3달 전

map, filter는 모나딕한 작업을 통해 어떠한 이터러블을 반환한다고 하셨는데 모나딕이란 무엇인가요?

4
주홍철 프로필

지연평가 - 이터레이터 질문 주홍철 3달 전

지연평가에서 take부터 시작되는 이유가 iter.next()라는 함수가 선언이 되고 그 이터레이터가 그 밑의 함수로 쭉 들어가서 먼저 실행이 된다가 맞나요? 헷갈려서 질문드립니다 ㅎㅎㅎ ㅠ iter.next()가 실행이 된다면 이터레이터 참조를 하기 위해 take부터 실행이 되는 건가요? 근데 하.. f라는 인자는 while그 다음에 넘기는데.. 음......뭘까요? ㅠㅠ

4