Functional Programming (TypeScript)
Array.prototype
map
- ๋ฐฐ์ด ๋ด์ ๋ชจ๋ ์์ ๊ฐ๊ฐ์ ๋ํ์ฌ ์ฃผ์ด์ง ํจ์๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
[1, 4, 9, 16].map((item) => item * 2);
forEach
- ์ฃผ์ด์ง ํจ์๋ฅผ ๋ฐฐ์ด ์์ ๊ฐ๊ฐ์ ๋ํด ์คํํ๋ค.
['a', 'b', 'c'].forEach((item) => console.log(item));
filter
- ์ฃผ์ด์ง ํจ์์ ํ
์คํธ๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
[3, 10, 20, 1, 9].filter((item) => item < 10);
some
- ๋ฐฐ์ด ์์ ์ด๋ค ์์๋ผ๋ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ํต๊ณผํ๋์ง ํ
์คํธํ๋ค.
- ์กฐ๊ฑด์ ๋ง๋ ์์๊ฐ ์์ผ๋ฉด ์ฆ์ true๋ฅผ ๋ฐํํ๋ค.
[1, 2, 3, 4, 5].some((item) => item % 2 === 0);
every
- ๋ฐฐ์ด ์์ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ํต๊ณผํ๋์ง ํ
์คํธํ๋ค.
- ์กฐ๊ฑด์ ๋ง์ง ์๋ ์์๊ฐ ์์ผ๋ฉด ์ฆ์ false๋ฅผ ๋ฐํํ๋ค.
[1, 30, 39, 29, 10, 13].every((item) => item < 40);
reduce
- ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ฃผ์ด์ง ๋ฆฌ๋์(reducer) ํจ์๋ฅผ ์คํํ๊ณ , ํ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค.
[1, 2, 3, 4].reduce((acc, curr) => acc + curr);
[1, 2, 3, 4].reduce((acc, curr) => acc + curr, 10);
Monad
- ๋ชจ๋๋๋ ํ์
์ด์ ๋์์ธํจํด์ด๋ค.
- ๋ชจ๋๋๊ฐ ๋๊ธฐ ์ํด์๋ ๋ค์ 3๊ฐ์ง ์์๊ฐ ํ์ํ๋ค.
- ํ์
์์ฑ์ - ์์ ํ์
์ ๋ํด ๋ชจ๋๋ํ๋ ํ์
์ ๋ง๋ค๊ธฐ ์ํ ์์ฑ์.
- unit ํจ์ - ์์ ํ์
์ ๊ฐ์ ๋ชจ๋๋์ ๋ฃ๋ ํจ์.
T
ํ์
๊ฐ์ ๋ฐ์ M<T>
ํ์
์ ๊ฐ์ ๋ฐํํ๋ค.
- bind ํจ์ - ๋ค๋ฅธ ๋ชจ๋ํธ ํ์
์ผ๋ก ๋์์ ์ฐ๊ฒฐํ๋ ํจ์.
M<T>
๊ฐ ์์ผ๋ฉด T
ํ์
๋ณ์๋ฅผ ๋ฐ์ M<U>
ํ์
์ ๊ฐ์ ๋ฐํํ๋ค.
interface M<T> { }
function unit<T>(value: T): M<T> { ... }
function bind<T, U>(instance: M<T>, transform: (value: T) => M<U>): M<U> { ... }
์ฐธ๊ณ ์๋ฃ
์ด ๋ฌธ์๋ฅผ ์ธ์ฉํ ๋ฌธ์