这是我之前question
的后续内容假设我有一个RandomGen[A]
monad。
这实际上是一个函数:Long => (Long, A)
map
和flatMap
以及另一个函数certain
来创建RandomGen
的新实例(作为 return in Haskell)
class RandomGen[A](run: Long => (Long, A)) {
def apply(seed: Long) = run(seed)
def flatMap[B](f: A => RandomGen[B]): RandomGen[B] =
new RandomGen(seed => {val (seed1, a) = run(seed); f(a)(seed1)})
def map[B](f: A => B): RandomGen[B] =
new RandomGen(seed => {val (seed1, a) = run(seed); (seed1, f(a))})
}
def certain[A](a: A): RandomGen[A] = new RandomGen(seed => (seed, a))
假设我还有一个随机bits
def nextbits(bits: Int): RandomGen[Int] = ...
现在我想添加新的 generator ,它产生0到给定n
之间的随机数。我从java.util.Random复制了实现,并省略了n
为了简单起见,def integer(n: Int): RandomGen[Int] =
nextbits(31).flatMap {r =>
val value = r % n
if (r - value + (n -1) < 0) integer(n) else certain(value)
}
是2的幂的特殊情况。
{{1}}
有意义吗?
答案 0 :(得分:1)
是。请注意,这只是State monad,因此如果您愿意,可以重用scalaz实现。你也可以使用map而不是flatMap,避免需要调用某些。