haskell自己的数据类型的随机实例

时间:2017-11-06 09:05:02

标签: haskell random instance gloss

我正在使用Graphics.gloss开发一款在Haskell中制作的小行星游戏。现在我已经为这样的小行星定义了一个数据类型:

data Asteroid = Asteroid {   asteroidPos:: Point, 
                             asteroidVel   :: Vector,
                             asteroidSize  :: Float }

因此它有一个由一个点定义的位置,一个由矢量定义的速度和它的大小。现在我想知道如何为这个数据类型编写一个Random实例,以便随机时间出现一个新的小行星,在一个随机速度的随机位置。有谁知道我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

Random已经有Float个实例。假设您还有RandomVector的{​​{1}}个实例,您可以使用它们为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是由sFloat生成的randomR

返回值是由FloatAsteroidp以及最新生成器v组成的新s值。

g3的实施遵循相同的模板。

您可以使用更好的形式编写此代码。使用random,但对于初学者,我将代码保留为原始格式以显示其工作原理。