이펙트 시스템(Effect System)은 함수의 부작용(Side Effect)을 타입 수준에서 추적하고 제어하는 타입 이론 개념이다. 함수가 어떤 부작용(IO, 예외, 상태 변경)을 일으킬 수 있는지를 타입 시그니처에 명시해 안전성을 높인다.
부작용의 종류
순수 함수: 부작용 없음, 같은 입력 → 같은 출력
부작용 종류:
- IO: 파일 읽기/쓰기, 네트워크 요청
- 상태 변경: 전역 변수 수정
- 예외: 오류 던지기
- 비결정성: 난수 생성
- 시간: 현재 시각 읽기
- 동시성: 스레드, 채널
haskell
-- IO 타입이 이펙트를 표현
readFile :: FilePath -> IO String -- IO 이펙트
putStrLn :: String -> IO () -- IO 이펙트
-- Maybe로 실패 가능성 표현
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:_) = Just x
-- Either로 오류 표현
parseAge :: String -> Either String Int
parseAge s = case reads s of
[(n, "")] -> if n >= 0 then Right n else Left "음수 불가"
_ -> Left "숫자가 아님"
최신 접근법: 이펙트를 대수적으로 정의
Koka, Eff, OCaml 5 이펙트 핸들러
예시 (Koka):
effect raise<a>
fun raise(msg: string): a
fun safe-div(x: int, y: int): raise<int> int
if y == 0 then raise("나눗셈 오류")
else x / y
// 핸들러로 이펙트 처리
with handler
fun raise(msg) { println(msg); 0 }
safe-div(10, 0) // "나눗셈 오류" 출력 후 0 반환
언어별 이펙트 시스템
| 언어 | 방식 | 특징 |
|---|
| Haskell | 모나드 IO | 성숙, 표현력 높음 |
| Rust | unsafe + 타입 | 명시적 불안전 코드 |
| OCaml 5 | 이펙트 핸들러 | 대수적 이펙트 |
| Koka | 행(Row) 이펙트 | 연구 언어, 선진적 |
| Java/Kotlin | 체크드 예외 | 제한적 이펙트 시스템 |
관련 개념