반복문 아님
여러 비동기 함수를 읽기 쉽게 다루는 문법, 즉 syntax sugar
for {
value2 <- step1(value1)
value3 <- step1(value2)
value4 <- step1(value3)
value5 <- step1(value4)
value6 <- step1(value5)
res <- step1(value6)
} yield res
for comprehension 또는 sequence comprehension 이라고 불린다.
상황에 따라 foreach, flatmap, filter, map으로 translate 가능
import zio._
import java.io.IOException
object Main extends ZIOAppDefault {
override def run =
for {
start <- print("시작")
end = print("끝")
_ <- end
} yield ()
private def print(line: String): ZIO[Any, IOException, Int] = {
zio.Console.printLine(line).as(0)
}
}
이전 글 실습 1.2 코드이다.
import zio._
import java.io.IOException
object Main extends ZIOAppDefault {
override def run = print("시작")
.map(_ => print("끝"))
.flatMap(two => two)
private def print(line: String): ZIO[Any, IOException, Int] = {
zio.Console.printLine(line).as(0)
}
}
실행 결과는 위와 동일하다.
flatMap을 override했기 때문이다.
ZIO 내부 구현을 보면 다음과 같다.
ZIO.OnSuccess(trace, self, k)
을 만들어 주는 것을 확인할 수 있다.