Scala ZIO Stream 数据类型
Scala ZIO Stream datatype
是否可以找到 ZIO Stream 的大小,我有两个流,想找到两者之间的内积,我的问题是如何找到大小以便迭代它们。我使用 map 和 foldMap 解决了这个问题,但我想检查两种方式之间的性能?
这是我使用 Fold 和 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
我假设 "inner product",你的意思是你有两个 Stream[Double]
,你想将其视为数学向量,并在遍历整个流后计算单个输出值。
为此,很容易使用zip
计算两个流的逐元素乘积,然后foldLeft
计算最终结果。
val products: Stream[Double] = stream1.zip(stream2).map(_ * _)
val innerProduct: UIO[Double] = products.run(Sink.foldLeft(_ * _))
是否可以找到 ZIO Stream 的大小,我有两个流,想找到两者之间的内积,我的问题是如何找到大小以便迭代它们。我使用 map 和 foldMap 解决了这个问题,但我想检查两种方式之间的性能? 这是我使用 Fold 和 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
我假设 "inner product",你的意思是你有两个 Stream[Double]
,你想将其视为数学向量,并在遍历整个流后计算单个输出值。
为此,很容易使用zip
计算两个流的逐元素乘积,然后foldLeft
计算最终结果。
val products: Stream[Double] = stream1.zip(stream2).map(_ * _)
val innerProduct: UIO[Double] = products.run(Sink.foldLeft(_ * _))