Generator와 Assignment의 차이

CHEESE·2023년 7월 16일
0

OSSCA 2023

목록 보기
1/7
post-thumbnail

등장인물

Generator

  • <-
  • 프로그램(함수)을 실행한다.
  • 리턴 값을 반환한다.

Assignment

  • =
  • 그냥 대입만 한다.

이해하기

1단계. 무엇이 실행될까?

1-1

import zio._

import java.io.IOException

object Main extends ZIOAppDefault {
  override def run =
    for {
      start <- print("시작")
      end = print("끝")
    } 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 =
    for {
      start <- print("시작")
      end = print("끝")
      _ <- end
    } yield ()

  private def print(line: String): ZIO[Any, IOException, Int] = {
    zio.Console.printLine(line).as(0)
  }
}
  • 실행 결과
시작
끝

결론

  • Assignment는 함수를 실행하지 않는다.

2단계. 실행한 후에는 뭐가 남을까?

2-1

import zio._

import java.io.IOException

object Main extends ZIOAppDefault {
  override def run =
    for {
      start <- print("시작")
      end <- print("끝")
      _ <- print(s"start는 $start")
      _ <- print(s"end는 $end")
    } yield ()

  private def print(line: String): ZIO[Any, IOException, Int] = {
    zio.Console.printLine(line).as(0)
  }
}
  • 실행 결과
시작
끝
start는 0
end는 0

2-2

import zio._

import java.io.IOException

object Main extends ZIOAppDefault {
  override def run =
    for {
      start <- print("시작")
      end = print("끝")
      _ <- print(s"start는 $start")
      _ <- print(s"end는 $end")
    } yield ()

  private def print(line: String): ZIO[Any, IOException, String] = {
    zio.Console.printLine(line).as("끝!!")
  }
}
  • 실행 결과
시작
끝
start는 끝!!
end는 끝!!

결론

  • Generator는 함수 실행 후 함수가 반환한 값을 가진다.

3단계. 함수를 대입해서 출력하면 뭐가 나올까?

3-1

import zio._

import java.io.IOException

object Main extends ZIOAppDefault {
  override def run =
    for {
      start <- print("시작")
      hello = print("안녕하세요")
      _ <- print(s"hello는 $hello")
    } yield ()

  private def print(line: String): ZIO[Any, IOException, Int] = {
    zio.Console.printLine(line).as(0)
  }
}
  • 실행 결과
시작
hello는 OnSuccess(<empty>.Main.print(Main.scala:15),Stateful(<empty>.Main.print(Main.scala:15),zio.FiberRef$unsafe$$anon$2$$Lambda$330/0x0000000800db2650@58825efa),zio.ZIO$$Lambda$96/0x0000000800d3d000@5215f382)

3-2

import zio._

import java.io.IOException

object Main extends ZIOAppDefault {
  override def run =
    for {
      start <- print("시작")
      hello = print("안녕하세요")
      _ <- print(s"hello는 $hello")
      _ <- hello
    } yield ()

  private def print(line: String): ZIO[Any, IOException, Int] = {
    zio.Console.printLine(line).as(0)
  }
}
  • 실행 결과
시작
hello는 OnSuccess(<empty>.Main.print(Main.scala:15),Stateful(<empty>.Main.print(Main.scala:15),zio.FiberRef$unsafe$$anon$2$$Lambda$330/0x0000000800db2650@58825efa),zio.ZIO$$Lambda$96/0x0000000800d3d000@5215f382)
안녕하세요

결론

  • Assignment로 대입되면 함수에 파라미터까지 담긴 프로그램이 된다.
  • Assignment로 대입된 값을 Generator로 실행할 수 있다.

0개의 댓글