KOTLIN · 함수형
부수 효과 격리 (Effect Isolation)
부수 효과를 값으로 표현하여 실행을 지연시키는 패턴입니다. 테스트 용이성과 합성 가능성을 높입니다.
함수형고급io-monadeffectlazy-evaluationpure-fp
핵심 설명
부수 효과를 값으로 표현하여 실행을 지연시키는 패턴입니다. 테스트 용이성과 합성 가능성을 높입니다.
Kotlin code
// 부수 효과를 값으로 표현
sealed class IO<out A> {
data class Pure<A>(val value: A) : IO<A>()
data class Suspend<A>(val thunk: () -> A) : IO<A>()
data class FlatMap<A, B>(val io: IO<A>, val f: (A) -> IO<B>) : IO<B>()
fun <B> map(f: (A) -> B): IO<B> = flatMap { Pure(f(it)) }
fun <B> flatMap(f: (A) -> IO<B>): IO<B> = FlatMap(this, f)
@Suppress("UNCHECKED_CAST")
fun run(): A = when (this) {
is Pure -> value
is Suspend -> thunk()
is FlatMap<*, *> -> {
val result = (io as IO<Any?>).run()
(f as (Any?) -> IO<A>)(result).run()
}
}
}
fun readLine(): IO<String> = IO.Suspend { kotlin.io.readlnOrNull() ?: "" }
fun printLine(msg: String): IO<Unit> = IO.Suspend { println(msg) }
fun program(): IO<Unit> =
printLine("이름을 입력하세요:")
.flatMap { readLine() }
.flatMap { name -> printLine("안녕하세요, $name!") }
fun main() {
// 프로그램은 값일 뿐, run()할 때만 실행
val prog = printLine("Hello").flatMap { printLine("World") }
println("아직 실행 안됨")
prog.run() // 이때 실행
}학습 팁
IO 모나드는 효과를 기술(describe)하지만 실행하지 않습니다. 프로그램의 진입점에서만 run()을 호출하세요.
주의할 점
IO 내부에서 직접 println을 호출하면 격리가 깨집니다. 모든 부수 효과를 IO.Suspend로 래핑하세요.
자주 묻는 질문
부수 효과 격리 (Effect Isolation)란 무엇인가요?
부수 효과를 값으로 표현하여 실행을 지연시키는 패턴입니다. 테스트 용이성과 합성 가능성을 높입니다.
부수 효과 격리 (Effect Isolation) 학습 시 주의할 점은 무엇인가요?
IO 내부에서 직접 println 을 호출하면 격리가 깨집니다. 모든 부수 효과를 IO.Suspend 로 래핑하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.