基本上我正在尝试生成由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
属性时发生一次,这不是一个大问题