已经Random
有Float
. 假设您还有和的Random
实例,您可以使用它们来定义 的实例:Vector
Point
Random
Asteroid
instance Random Asteroid where
randomR (Asteroid pl vl sl, Asteroid ph vh sh) g =
let (p, g1) = randomR (pl, ph) g
(v, g2) = randomR (vl, vh) g1
(s, g3) = randomR (sl, sh) g2
in (Asteroid p v s, g3)
random g =
let (p, g1) = random g
(v, g2) = random g1
(s, g3) = random g2
in (Asteroid p v s, g3)
该randomR
函数采用一系列值,从最小值(低)到最大值(高)。你如何定义一个复杂值的有意义的范围Asteroid
,我会留给你;在这里,我只是假设您可以传递低值和高Asteroid
值。
第一步通过调用使用底层Random
实例。是一个随机生成的值,是下一个要使用的随机生成器值。Point
randomR
p
Point
g1
同样,v
是一个随机生成的Vector
值,由 的基础实例生成Vector
。
最后,s
是由forFloat
生成的。randomR
Float
返回值是Asteroid
由 、 和 加上最新的生成器组成p
的v
新s
值g3
。
的实现random
遵循相同的模板。
您可以用更漂亮的形式编写此代码,例如使用 using MonadRandom
,但对于初学者,我将代码保留为原始形式以显示其工作原理。