【发布时间】:2020-04-03 01:09:39
【问题描述】:
我正在尝试为 ScalaCheck 的 Gen 类型编写 Monad Transformer 实例。
即:如下所示的类型,可以用作 Monad,前提是底层函子 F 是 Monad。
case class GeneratorT[F[_], A](generator: Gen[F[A]])
object GeneratorT {
implicit 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(_.flatten)))
}
本能地,我觉得我应该能够为Gen 编写一个Distributive 实例,因为Gen 或多或少只是一些配置的函数和种子,一个值,函数是分布的。
话虽如此,我没有找到任何人这样做的例子,我正在努力编写它,因为 ScalaCheck 没有暴露Gen 的内部结构。
这可能吗?
【问题讨论】:
标签: scala functional-programming monad-transformers scala-cats scalacheck