π€ Chapter 11: λͺ¨λλ
π¦ λͺ¨λλ μ΄ν΄νκΈ°β
- νλ‘κ·Έλλ°μμ λͺ¨λλλ μΌμ’ μ μ½λ μ€κ³ ν¨ν΄μΌλ‘μ λͺ κ°μ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ€.
- λͺ¨λλ ν΄λμ€λ λͺ κ°μ§ 곡ν΅μ μΈ νΉμ§μ΄ μλ€.
π νμ ν΄λμ€λ?β
- λͺ¨λλλ₯Ό μ΄ν΄νλ 첫걸μμ νμ ν΄λμ€κ° μ νμνμ§ μλ κ²μ΄λ€.
- μμ±μμ μλλ₯Ό μ΄ν΄νμ§ λͺ»ν μ½λλ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’
λ£λκΈ° λλ¬Έμ μ΄λ₯Ό λ°©μ§νλ €λ©΄ 맀κ°λ³μ
b
λ λ°λμmap
λ©μλκ° μλ νμ μ΄λΌκ³ νμ μ μ νν΄μΌ νλ€.
const callMap = fn => b => b.map(fn);
// νμ
μ μ ν
const callMap = <T, U>(fn: (T) => U) => <T extends { map(fn) }>(b: T) => b.map(fn);
- λͺ¨λλ λ°©μ μ€κ³λ λ°λμ
map
κ³Όof
λΌλ μ΄λ¦μ λ©μλκ° μλMonad<T>
ν΄λμ€λ₯Ό λ§λ λ€.
class Monad<T> {
constructor(public value: T){}
static of<U>(value: U): Monad<U> { return new Monad<U>(value) }
map<U>(fn: (x: T) => U): Monad<U> { return new Monad<U>(fn(this.value)) }
}
- μ΄μ²λΌ
Monad<T>
μ κ°μ ν΄λμ€λ₯Ό νμ ν΄λμ€λΌκ³ νλ€. νμ ν΄λμ€λ λ€μμ²λΌ ν¨μλ₯Ό λ§λ€ λ νΉλ³ν νμ μΌλ‘ μ μ½νμ§ μμλ λλ€.
const callMonad = (fn) => (b) => Monad.of(b).map(fn).value;
Monad<T>
μ κ°μ νμ ν΄λμ€ λλΆμcallMonad
μ²λΌ νμ μ λ°λ₯Έ μμ μ±μ 보μ₯νλ©΄μλ μ½λμ μ¬μ¬μ©μ±μ΄ λ°μ΄λ λ²μ© ν¨μλ₯Ό μ½κ² λ§λ€ μ μλ€.
callMonad((a: number) => a + 1)(1); // 2
callMonad((a: number[]) => a.map(value => value + 1))([1, 2, 3, 4]); // [2, 3, 4, 5]
π κ³ μ°¨ νμ μ΄λ?β
- μμ λ³Έ
Monad<T>
λ νμT
λ₯ΌMonad<T>
νμ μΌλ‘ λ³ννλ€κ° λκ° λλ©΄ λ€μ νμT