我正在寻找实现生成器组合器的一个版本(例如,类似于 ScalaCheck 或 Haskell 的 QuickCheck 中的组合器),其中生成器包含 Rand 的一个实例,一个代表概率分布的单子(取自微风库)。由于是 monad,Rand 实现了 map 和 flatMap。通常,我也想将 Gen 实现为 monad。如下所示,Gen 的 map 实现很简单:
// Rand is from the breeze library
trait Rand[T] {
def map[U](f: T => U): Rand[U]
def flatMap[U](f: T => Rand[U]): Rand[U]
}
case class Gen[T](dist: Rand[T]) {
def map[U](f: T => U): Gen[U] = Gen(dist.map { f })
def flatMap[U](f: T => Gen[U]): Gen[U] = {
// How to implement this?
}
}
但是,我不清楚 flatMap 应该如何实现。这很容易实现,还是(例如)需要通过一些中间数据类型进行间接级别?