在聚合monad上实现flatMap

时间:2016-04-10 16:32:04

标签: scala haskell monads scala-breeze

我希望实现一个版本的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。这是否容易实现,或者(例如)是否需要通过某种中间数据类型的间接级别?

0 个答案:

没有答案