π€ Chapter 8: ν¨μ μ‘°ν©μ μ리μ μμ©
π¦ ν¨μν νλ‘κ·Έλλ°μ΄λ?β
- ν¨μν νλ‘κ·Έλλ°μ μμ ν¨μμ μ μΈν νλ‘κ·Έλλ°μ ν λ μμ ν¨μ μ‘°ν©κ³Ό λͺ¨λλ μ‘°ν©μΌλ‘ μ½λλ₯Ό μ€κ³νκ³ κ΅¬ννλ κΈ°λ²μ΄λ€.
- ν¨μν νλ‘κ·Έλλ°μ λ€μ μΈ κ°μ§ μν μ΄λ‘ μ κΈ°λ°μ λκ³ μλ€.
- λλ€ μν(ramda calculus): μ‘°ν© λ Όλ¦¬μ μΉ΄ν κ³ λ¦¬ μ΄λ‘ μ ν λκ° λλ λ Όλ¦¬ μν
- μ‘°ν© λ Όλ¦¬(combinatory logic): ν¨μ μ‘°ν©μ μ΄λ‘ μ λ°°κ²½
- μΉ΄ν κ³ λ¦¬ μ΄λ‘ (category theory): λͺ¨λλ μ‘°ν©κ³Ό κ³ μ°¨ νμ μ μ΄λ‘ μ λ°°κ²½
- ν¨μν νλ‘κ·Έλλ° μΈμ΄λ μ μ νμ (static type), μλ λ©λͺ¨λ¦¬ κ΄λ¦¬(automatic memory management), κ³μ°λ²(evaluation), νμ μΆλ‘ (type inference), μΌλ± ν¨μ(first-class function)μ κΈ°λ°μ λκ³ , λμ λ°μ΄ν° νμ (algebraic data type), ν¨ν΄ 맀μΉ(pattern matching), λͺ¨λλ(monad), κ³ μ°¨ νμ (high order type) λ±μ κ³ κΈ κΈ°λ₯μ μ 곡νλ€. λ€λ§, ν¨μν μΈμ΄λΌκ³ ν΄μ μ΄λ¬ν κΈ°λ₯μ λͺ¨λ μ 곡νμ§λ μλλ€.
π¦ μ λ€λ¦ ν¨μβ
- νμ
λ³μ
T
λ‘ νκΈ°ν λ μ΄λ₯Ό μ λ€λ¦ νμ μ΄λΌκ³ νλ€.
π νμ μ€ν¬λ¦½νΈμ μ λ€λ¦ ν¨μ ꡬ문β
- νμ
μ€ν¬λ¦½νΈμμ μ λ€λ¦ νμ
μ ν¨μμ μΈν°νμ΄μ€, ν΄λμ€, νμ
λ³μΉμ μ μ©ν μ μμΌλ©°, κΊ½μ κ΄νΈ
<>
λ‘ νμ μ κ°μΌ<T>
,<T, Q>
μ²λΌ νννλ€.
function g1<T>(a: T): void {};
function g2<T, Q>(a: T, b: Q): void {};
- μ λ€λ¦ νμ
μΌλ‘ ν¨μλ₯Ό μ μνλ©΄ μ΄λ€ νμ
μλ λμν μ μλ€.
g1
ν¨μλa
맀κ°λ³μκ° μ λ€λ¦ νμ μΌλ‘ μ§μ λμκ³ ,g2
ν¨μλa
μb
맀κ°λ³μκ° κ°κ° λ€λ₯Έ μ λ€λ¦ νμ μΌλ‘ μ§μ λμλ€.
// νμ΄ν ν¨μ
const g3 = <T>(a: T): void => {};
const g4 = <T, Q>(a: T, b: Q): void => {};
// νμ
λ³μΉμ μ λ€λ¦ νμ
μ μ μ©
type Type1Func<T> = (T) => void
type Type2Func<T, Q> = (T, Q) => void
type Type3Func<T, Q, R> = (T, Q) => R; // Tμ Q νμ
κ°μ μ
λ ₯λ°μ R νμ
κ°μ λ°ν
π ν¨μμ μν β
- μνμμ ν¨μλ κ°
x
μ μμμ μ μ©ν΄ λ λ€λ₯Έ κ°y
λ₯Ό λ§λλ μν μ νλ€. - ν¨μλ₯Ό
f
λΌκ³ νκΈ°νλ©΄ κ°x
,y
,f
κ°μ κ΄κ³λ₯Ό λ€μμ²λΌ ννν μ μλ€.
x ~> f ~> y
- ν¨μ
f
κ°T
νμ μx
κ°μΌλ‘R
νμ μy
κ°μ λ§λ λ€κ³ νλ©΄ λ€μμ²λΌ νννλ€.
(x: T) ~-> f -> (y: R)
- μνμμλ μ΄λ° κ΄κ³λ₯Ό μΌλμΌ κ΄κ³λΌκ³ νκ³ , μ΄λ° λμμ νλ ν¨μ
f
λ₯Ό 맀ν μ€μ¬μ 맡μ΄λΌκ³ νννλ€. - νμ
μ€ν¬λ¦½νΈ μΈμ΄λ‘ μΌλμΌ λ§΅ ν¨μλ₯Ό λ§λ λ€λ©΄ νμ
T
μΈ κ°μ μ΄μ©ν΄ νμR
μΈ κ°μ λ§λ€μ΄ μ£Όμ΄μΌ νλ―λ‘, ν¨μμ μκ·Έλμ²λ₯Ό λ€μμ²λΌ ννν μ μλ€.
type MapFunc<T, R> = (T) => R
π μμ΄λ΄ν°ν° ν¨μβ
- 맡 ν¨μμμ κ°μ₯ λ¨μν ννλ μ
λ ₯κ°
x
λ₯Ό κ°κ³΅ μμ΄ κ·Έλλ‘ λ°ννλ€. μ¦, μ λ ₯κ³Ό μΆλ ₯ νμ μ΄ κ°λ€. - ν¨μν νλ‘κ·Έλλ°μμ μ΄λ¬ν μν μ νλ ν¨μ μ΄λ¦μλ 보ν΅
identity
νΉμI
λΌλ λ¨μ΄κ° ν¬ν¨λλ€. μμμ μλ‘ λMapFunc
νμ μ μ¬μ©ν΄ μμ΄λ΄ν°ν° ν¨μμ μκ·Έλμ²λ₯Ό λ€μμ²λΌ ννν μ μλ€.
type MapFunc<T, R> = (T) => R
type IdentityFunc<T> = MapFunc<T, T>
- μ΄λ κ² μ μν μ λ€λ¦ ν¨μ νμ
IdentityFunc<T>
λ λ€μκ³Ό κ°μ λ€μν ν¨μλ₯Ό μ μΈν λ ν¬κ΄μ μΌλ‘ μ¬μ©ν μ μλ€.
const numberIdentity: IdentityFunc<number> = (x: number): number => x;
const stringIdentity: IdentityFunc<string> = (x: string): string => x;
const arrayIdentity: IdentityFunc<any[]> = (x: any[]): any[] => x;