我希望实现一个版本的Generator组合器(例如类似于ScalaCheck或Haskell的QuickCheck),其中Generator包含一个Rand实例,一个代表概率分布的monad(采用来自微风图书馆)。由于它是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。这是否容易实现,或者(例如)是否需要通过某种中间数据类型的间接级别?