zio/zio1

피보나치(fibonacci) 수열을 Scala Stream, ZStream 으로 각각 구현

wefree 2021. 8. 3. 00:47

문제

피보나치(fibonacci) 수열 앞 10개를 출력하는 프로그램을 아래  2가지 방법으로 각각 구현하라

  1. scala stream 을 이용해 구현
  2. ZStream 을 이용해 구현

 

코드

scala stream 을 이용한 구현

object ScalaStreamFibo {
  def main(args: Array[String]): Unit = {
    def fibonacci(h: Long, n: Long): Stream[Long] = h #:: fibonacci(n, h + n)
    fibonacci(0, 1).take(10).foreach(println)
  }
}

ZStream 을 이용한 구현

import zio._
import zio.stream.ZStream

object ZStreamFibo extends App {
  val fibonacci: ZStream[Any, Nothing, Long] = ZStream.unfold((0, 1)) {
    case (h, n) => Option(h, (n, h + n))
  }

  override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] =
    fibonacci.take(10).foreach(x => console.putStrLn(x.toString)).exitCode
}

 

설명

scala stream 을 이용한 구현은 Martin Odersky 의 'Programming in Scala' 에도 나와있다.  이런 재귀를 생각해 구현하기는 매우 어렵다. 이에 비해 zio 의 ZStream 을 이용한 구현은 State 를 활용해 이해하기가 훨씬 쉬운것 같다.