---
type: snippet
tags: ['monad', 'functional-programming']
status: release
ctime: 2025-01-01
mtime: 2025-01-01
---

모나드 입문

모나드 = 복잡한 처리를 숨기면서 연속된 연산을 가능하게 하는 패턴

1. **타입 래퍼** - 값을 감싸는 구조 (예: `NumberWithLogs`)
2. **래핑 함수** (unit/return) - 값을 모나드로 감쌈
3. **바인딩 함수** (bind/flatMap) - 래핑된 값에 함수 적용

```typescript
interface NumberWithLogs {
  result: number
  logs: string[]
}

function wrapWithLogs(n: number): NumberWithLogs {
  return { result: n, logs: [] }
}

function runWithLogs(
  input: NumberWithLogs,
  transform: (n: number) => NumberWithLogs
): NumberWithLogs {
  const next = transform(input.result)
  return { result: next.result, logs: [...input.logs, ...next.logs] }
}
```

Option, Promise도 모나드. `then`이 바인딩 함수 역할.
