scala에서 for는 뭘까?

CHEESE·2023년 7월 18일
0

OSSCA 2023

목록 보기
2/7
post-thumbnail

반복문 아님
여러 비동기 함수를 읽기 쉽게 다루는 문법, 즉 syntax sugar

for ... yield

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)
  }
}

실행 결과는 위와 동일하다.

ZIO는 어떻게 flatMap을 사용했을까?

flatMap을 override했기 때문이다.
ZIO 내부 구현을 보면 다음과 같다.
ZIO.OnSuccess(trace, self, k)을 만들어 주는 것을 확인할 수 있다.

0개의 댓글