gpt4 book ai didi

scala - 在需要 Concurrent 和 Timer 类型类实例的测试中使用什么类型?

转载 作者:行者123 更新时间:2023-12-04 01:48:33 29 4
gpt4 key购买 nike

考虑以下示例:

import cats.Functor
import cats.effect.{Concurrent, Timer}
import cats.syntax.functor._
import fs2.Stream

import scala.concurrent.duration._

class FetchAndSum[F[_]: Timer: Concurrent: Functor](fetch: List[String] => F[List[Int]]) {

def run(inputs: List[String]): F[Int] =
Stream
.emits(inputs)
.covary[F]
.groupWithin(20, 10.millis)
.mapAsync(10)(chunk => fetch(chunk.toList))
.flatMap(Stream.emits)
.reduce(_ + _)
.compile
.last
.map(_.getOrElse(0))
}

在生产中,这是用 IO Monad 实例化的。

在我的测试中,我想测试fetch 函数被调用了多少次。如果 F[_] 只需要一个 Functor 实例,我可以简单地使用 Writer monad 来做到这一点。

由于 fs2 的 mapAsyncgroupedWithinF[_] 还必须有 Timer 的实例和 Concurrent,这些当然不存在于 Writer 上。

我可以使用什么数据类型以功能方式对此进行测试?

我想过以某种方式将 IOWriter 结合起来,例如type IOWriter[A] = IO[Writer[Int, A]],但如果不重新声明 IOWriter 的所有类型类实例,我就无法完成这项工作。

有没有什么东西可以让我在不必重新声明所有类型类实例的情况下实现这一目标?

最佳答案

IORef一起使用:

val numsExecuted: IO[Int] = for {
ref <- Ref[IO].of(0)
fetch = (l: List[String]) => ref.update(_ + 1).as(???)
_ <- new FetchAndSum[IO](fetch).run(???)
x <- ref.get
} yield x

您还可以将 WriterIO 结合使用。这个构造被称为 Writer monad 转换器 (type IOWriter[A] = cats.data.WriterT[IO, A]) 并且应该有 Concurrent/Timer/Monad/等开箱即用的实例。

关于scala - 在需要 Concurrent 和 Timer 类型类实例的测试中使用什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54341748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com