functional composition - Lee-hyuna/33-js-concepts-kr GitHub Wiki
ํจ์์ ํฉ์ฑ - compose() ์ pipe()
ํจ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ ์์ด๋์ด๋ ํจ์๋ค์ ์ฎ๋ ๊ฒ์ด๋ค. ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ํํ๋ ์์ ํจ์๋ค์ ์กฐ๋ฆฝํ์ฌ ํ์ฌ ๋ณต์กํ ๊ธฐ๋ฅ ์ ์์ฑํ๋ค.
์ด๊ฒ์ด ๋ฐ๋ก **ํจ์์ ํฉ์ฑ(function composition)**์ด๋ค. ์ด๊ฒ์ ํ ํจ์์ ์ถ๋ ฅ์ ๋ค๋ฅธ ํจ์์ ์ ๋ ฅ ์ผ๋ก ์ ๋ฌํจ์ผ๋ก์จ ๋ฌ์ฑ๋๋ค.
ํฉ์ฑ์ ๊ธฐ์ด
์๋์ ์ํ ํจ์๋ฅผ ์ดํด๋ณด์.
f(x) = x + 2
g(x) = 4x
์์ ํจ์๋ฅผ ์๋์ ๊ฐ์ด ํฉ์ฑํ ์ ์์ ๊ฒ์ด๋ค.
f(g(x)) = 4x + 2
// ๋๋
g(f(x)) = 4x + 8
๋งจ ์ฒ์ ์ํ ํจ์๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค,
const addTwo = x => x + 2;
const multiplyByFour = x => 4 * x;
๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์๊ณผ ๊ฐ์ด ํฉ์ฑํ ์ ์์ ๊ฒ์ด๋ค.
const composed1 = X => addTwo( multiplyByFour(X) );
// ๋๋
const composed2 = X => multiplyByFour( addTwo(X) );
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
๋ฌธ์
๋ฌธ์ ๋ ์ด์ ๊ฐ์ด ํจ์๋ฅผ ํฉ์ฑํ๋ ๊ฒ์ ์ ํฉ ํ์ง ์๋ค๋ ๊ฒ์ด๋ค. ๋ง์ ํจ์๋ค์ด ์กด์ฌํ๋ค๋ฉด, ๊ทธ ํจ์๋ค์ ํฉ์ฑ์ ์๋์ฒ๋ผ ๋ณด์ผ ๊ฒ์ด๋ค.
func1(func2(func3(func4(func5(func6(func7(x)))))))
์ฝ๊ธฐ ์ฐธ ์ด๋ ค์ด ์ฝ๋๋ค.
์ด๊ฒ์ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น? ๋ต์ compose()
์ pipe()
์ด๋ค.
compose()
compose()
๋ **์ธ์๋ฅผ ํจ์๋ก ๋ฐ๋๋ฐ **, ๋ฐ์ดํฐ ํ๋ก์ฐ๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก์ด์ด์ง๋ฉฐ ์ธ์๋ค์ ๊ฒฐํฉํ๋ค. ๊ทธ ๋ค์ ๊ฒฐํฉ ๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
๊ตฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
const compose = (...fns) => {
return x => {
return fns.reduceRight((y, f) => f(y), x)
}
}
์ฌ์ฉ ๋ฒ์ ์๋์ ๊ฐ๋ค.
const addTwo = x => x + 2;
const multiplyByFour = x => 4 * x;
const composeFunc = compose(multiplyByFour, addTwo)
const result = composeFunc(3)
์ผ์ชฝ <-- ์ค๋ฅธ์ชฝ
์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํ๋ฅด๊ณ ์์์ ์์ ์๋ค.
20 <-- multiplyByFour(5) <-- 5 <-- addTwo(3) <-- 3
์ด์ ์ ํจ์์ ํฉ์ฑ๋ณด๋ค ํจ์ฌ ๋ซ๋ค. ๐
pipe()
pipe()
๋ compose()
์ ๊ฑฐ์ ๋์ผํ๋ค. ์ ์ผํ ์ฐจ์ด๊ฐ ํ๋ ์๋๋ฐ, pipe()
๋ ๋ฐ์ดํฐ ์ด๋์ด ์ผ์ชฝ --> ์ค๋ฅธ์ชฝ
์ผ๋ก๋ฐ๋ ๋ฐฉํฅ์ด๋ค.:
๊ตฌํ์ ์๋์ ๊ฐ๋ค. ์ ์ผํ ์ฐจ์ด์ ์ Array.prototype.reduceRight
๋์ Array.prototype.reduce
์ด ์ฌ์ฉ ๋๋ค๋ ๊ฒ์ด๋ค.
const pipe = (...fns) => {
return x => {
return fns.reduce((y, f) => f(y), x)
}
}
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ ์ผํ ์ฐจ์ด์ ์ addTwo
์ multiplyByFour
๊ฐ ์๋ก ๋ฐ๋ ์์น๋ค. ๋ค์ ๋งํ์ง๋ง ์ด๋ pipe()
์์ ์ผ์ชฝ --> ์ค๋ฅธ์ชฝ
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
const addTwo = x => x + 2;
const multiplyByFour = x => 4 * x;
const pipeFunc = pipe(addTwo, multiplyByFour)
const result = pipeFunc(3)
์ผ์ชฝ --> ์ค๋ฅธ์ชฝ
๋ฐ์ดํฐ ํ๋ฆ์ด ๋ ์์ฐ ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก compose()
๋ณด๋ค pipe()
๋ฅผ ์ ํธํ๋ค .
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ์ธ์ด ์ด์ฉ์, ์ํ์๋ compose()
๋ฅผ ์ ํธํ ๊ฒ ๊ฐ๋ค.