scala - 随机作为 scalaz.Monad 的实例

标签 scala random monads scalaz

这是我之前的 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)

如果我们没有 RngMonad 实例,这是不可能的。

关于scala - 随机作为 scalaz.Monad 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090620/

相关文章:

java - 具有相同性能的内循环(易碎)替代方案

scala - Scala 中两个 map 的交集和合并/连接

python - 给定位数时生成 66666 等数字的最快方法

python - 弄清楚非均匀随机算法的工作原理

scala - 取消选择已选择的选项

java - 如何从 MultilayerPerceptronClassifier 获取分类概率?

scala - 在 Scala 中制作更多 "functional"代码以使用不可变集合

java - 洗牌和显示 10 java 小程序

haskell - (Monad m, Monoid o) => m o? 的应用实例

haskell - 哪些单子(monad)可以通过某个仿函数表示为 Free?