gpt4 book ai didi

scala - 在 Scala 中结合 scalacheck Gen 和 Future

转载 作者:行者123 更新时间:2023-12-05 07:41:22 27 4
gpt4 key购买 nike

基本上我正在尝试制作作为 HTTP 请求结果的生成器,因此我经常以 Gen[EitherT[Future, Error, T]] 之类的类型结束。 .

问题是似乎没有任何 monadic 实例(所以我可以做 sequence 或 monad 转换器)让我组成 Gen[EitherT[Future, Error, T]] 的不同实例

举个例子,假设我们有以下函数

def genUser: Gen[EitherT[Future, Error, User]]

def genAccounts(user: User): Gen[EitherT[Future, Error, List[Account]]

这个想法是为了能够正确地组合 Gen[EitherT[Future, Error,T]类型,所以 genAccounts电话 genUser ,即像

def genAccounts(user: User): Gen[EitherT[Future, Error, List[Account]] = for {
user <- genUser
accounts <- genAccounts(user)
} yield accounts

还有 scalacheck Gen提供一种方法来解除 Future进入 Gen (即从 Gen[Future[T]]Gen[T] 的方法)。即使这是阻塞的,如果它只在我们生成最终的 Gen 时发生一次,那也不是什么大问题。属性

最佳答案

截至目前(2022 年底),ScalaCheck 方面似乎没有对有效生成器的原生支持。有 one issue关于异步 Prop。正如问题中提到的,解决方案现在在库中实现 scalacheck-effect .

上述功能可能是一种解决方法,但需要嵌套异步属性而不是直接生成数据,例如

import org.scalacheck.Gen
import org.scalacheck.effect.PropF

import java.util.UUID
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }

object TestAsync {

case class Box(uuid: UUID)
case class Wrapped(box: Box, name: Option[String])

val propF: PropF[Future] = PropF.forAllF(Gen.uuid) { uuid =>
Future(Box(uuid)).map { box =>
PropF.forAllF(Gen.alphaNumStr) { name =>
Future(Wrapped(box, Some(name))).map { wrapped =>
PropF.boolean[Future](wrapped.name.nonEmpty)
}
}
}
}

def main(args: Array[String]): Unit = {
Await.result(
propF
.check()
.map(println),
Duration.Inf
)
}

}

该用例仅用于演示,已经表明使用嵌套的 PropFs 有点复杂。

另一种选择可能是使用 ZIO ,它处理的值与 EitherT[Future, Error, A] 非常相似,并且具有 effectful properties .

关于scala - 在 Scala 中结合 scalacheck Gen 和 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45372901/

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