这是我之前的 question 的后续内容。我写了一个 monad(用于练习),它实际上是一个生成随机值的函数。但它并未定义为 scalaz.Monad
类型的实例。
现在我查看了 Rng library并注意到它将 Rng
定义为 scalaz.Monad
:
implicit val RngMonad: Monad[Rng] =
new Monad[Rng] {
def bind[A, B](a: Rng[A])(f: A => Rng[B]) = a flatMap f
def point[A](a: => A) = insert(a)
}
所以我想知道用户到底如何从中受益。我们如何使用 Rng
是类型类 scalaz.Monad
的实例这一事实?你能举一些例子吗?
最佳答案
这是一个简单的例子。假设我想为一个范围选择一个随机大小,然后在该范围内选择一个随机索引,然后返回范围和索引。随机值的第二次计算显然取决于第一次计算 - 我需要知道范围的大小才能在范围内选择一个值。
这种事情正是单子(monad)绑定(bind)的用途——它允许您编写以下内容:
val rangeAndIndex: Rng[(Range, Int)] = for {
max <- Rng.positiveint
index <- Rng.chooseint(0, max)
} yield (0 to max, index)
如果我们没有 Rng
的 Monad
实例,这是不可能的。
关于scala - 随机作为 scalaz.Monad 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090620/