是否可以为ScalaCheck';编写一个分布式实例;s世代?

是否可以为ScalaCheck';编写一个分布式实例;s世代?,scala,functional-programming,monad-transformers,scala-cats,scalacheck,Scala,Functional Programming,Monad Transformers,Scala Cats,Scalacheck,我正在尝试为ScalaCheck的Gen类型编写Monad Transformer实例 也就是说:一种可以用作单子的类型,例如,如果基础函子F是单子 case-class-generator[F[u],A](生成器:Gen[F[A]] 对象生成器{ 隐式def monadForGeneratorT[F[]:Monad]:Monad[GeneratorT[F,*]=new Monad[GeneratorT[F,*]]{ ... } } 在写这篇文章时,我意识到如果我能够为Gen编写一个Distr

我正在尝试为ScalaCheck的
Gen
类型编写Monad Transformer实例

也就是说:一种可以用作单子的类型,例如,如果基础函子
F
是单子

case-class-generator[F[u],A](生成器:Gen[F[A]]
对象生成器{
隐式def monadForGeneratorT[F[]:Monad]:Monad[GeneratorT[F,*]=new Monad[GeneratorT[F,*]]{
...
}
}
在写这篇文章时,我意识到如果我能够为
Gen
编写一个
Distributive
实例,这将非常有用,因为这样我就能够以以下(有些复杂)的方式为
GeneratorT
编写
flatMap

override def flatMap[A,B](ga:GeneratorT[F,A])(fun:A=>GeneratorT[F,B]):GeneratorT[F,B]={
GeneratorT[F,B](ga.generator.flatMap(fa=>fa.map(a=>fun(a.generator).distribute(identity.map(u.flatte)))
}
本能地,我觉得我应该能够为
Gen
编写一个
Distributive
实例,因为
Gen
或多或少只是某个配置中的一个函数,一个种子,一个值,函数是分布式的

话虽如此,我还是没有找到一个这样做的例子,我正在努力编写它,因为ScalaCheck没有公开
Gen
的内部结构


这可能吗?

我想我理解为什么这不太可能;这是因为
Gen
支持过滤,因此,有可能以没有有效值的
Gen
结束

我认为
Gen
是一个函数
(属性,种子)=>a
,但实际上,这应该更像
(属性,种子)=>选项[a]

第一类分布,第二类不分布

例如,如果
Gen
可能出现故障,则
IO[Gen[A]]
无法转换为
Gen[IO[A]
,因为不评估
IO
就无法了解故障

如果您假设任何生成器在计算足够的次数后都会产生一个值,并且您愿意在情况并非如此的情况下遇到异常,则可以实现
分布式
,如下所示:

隐式val distributiveForGen:Distributive[Gen]=新Distributive[Gen]{
覆盖定义分布[G[uz]:函子,A,B](ga:G[A])(f:A=>Gen[B]):Gen[G[B]]=
Gen.parameterized(params=>ga.map(a=>f(a).pureApply(params,params.initialSeed.getOrElse(Seed(0 ')))))
覆盖def映射[A,B](fa:Gen[A])(f:A=>B):Gen[B]=fa.map(f)
}

我将暂缓使用此anwser,因为我仍然不能100%确定它,并希望给它一个更正的机会