Scala ZIO流数据类型

问题描述 投票:1回答:1

是否有找到ZIO Stream的大小的方法,我有两个流,想找到两者之间的内积,我的问题是如何找到大小以迭代它们。我使用map和foldMap解决了问题,但我想检查两种方法之间的性能?这是我使用Fold and Map的工作:

import zio._
import zio.console.{Console, putStrLn}
import zio.stream._
object InnerProduct extends App {

  val stream1: Stream[Nothing, Int] = Stream(1,2,3,4)
  val stream2: Stream[Nothing, Int] = Stream(4,5,6,7)


  def inner_fold [A,B,C,D,E](stream1:Stream[Nothing,A])(stream2:Stream[Nothing,B])(tms: (A, B) => C)(pls: (D, C) => D)(zero: D)= for{
    acc <- Ref.make(zero)
    acc2 <- acc.get
    i = 0
    compStream = stream1.zip(stream2)
    str = compStream.map(i => tms(i._1,i._2))
    streamFold<- str.fold(acc2)(pls)
    _ <-acc.set(streamFold)
  } yield acc

  override def run(args: List[String]) =
    for {
    res <- inner_fold[Int, Int, Int, Int,Int](stream1)(stream2)(_ * _)(_ + _ )(0)
      res2 <-res.get
      _ <- putStrLn(res2.toString)
    } yield (0)

}

输出:60

scala stream scalaz-zio
1个回答
0
投票

我将假定“内部乘积”是指您要考虑两个Stream[Double]作为数学矢量,并在对整个流进行迭代后计算单个输出值。

为此,很容易使用zip计算两个流的元素乘积,然后使用foldLeft计算最终结果。

val products: Stream[Double] = stream1.zip(stream2).map(_ * _)
val innerProduct: UIO[Double] = products.run(Sink.foldLeft(_ * _))
© www.soinside.com 2019 - 2024. All rights reserved.