【发布时间】:2016-07-31 15:41:59
【问题描述】:
我希望实现一个生成器组合器版本(例如,类似于 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 应该如何实现。这很容易实现,还是(例如)需要通过某种中间数据类型实现一定程度的间接性?
【问题讨论】:
标签: scala haskell monads scala-breeze