Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell自身数据类型的随机实例_Haskell_Random_Instance_Gloss - Fatal编程技术网

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

haskell自身数据类型的随机实例,haskell,random,instance,gloss,Haskell,Random,Instance,Gloss,我正在用Graphics.gloss制作Haskell制作的小行星游戏。现在我为小行星定义了一个数据类型,如下所示: data Asteroid = Asteroid { asteroidPos:: Point, asteroidVel :: Vector, asteroidSize :: Float } 所以它有一个由点定义的位置,一个由向量定义的速度和它的大小。现

我正在用Graphics.gloss制作Haskell制作的小行星游戏。现在我为小行星定义了一个数据类型,如下所示:

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

所以它有一个由点定义的位置,一个由向量定义的速度和它的大小。现在我想知道如何为这个数据类型编写一个随机的实例,这样一个新的小行星就会在一个随机的时间,在一个随机的地方以随机的速度出现。有人知道我是如何做到这一点的吗?

已经有了
Random
Float
实例。假设您还有
矢量
随机
实例,您可以使用它们来定义
小行星
随机
实例:

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
函数取值范围从最小值(低)到最大值(高)。你如何定义一个有意义的复杂值范围,比如小行星,我将留给你;在这里,我只是假设你可以通过一个高低
小行星值

第一步通过调用
randomR
点使用基础
Random
实例
p
是随机生成的
值,
g1
是下一个要使用的随机生成器值

类似地,
v
是由
Vector
的底层实例生成的随机生成的
Vector

最后,
s
是由
randomR
Float
生成的
Float

返回值是一个新的
小行星
值,由
p
v
s
组成,加上最近的生成器
g3

random
的实现遵循相同的模板


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

。您是否尝试编写此实例?你发现了什么问题?你看了吗?你能展示一下你在为你的小行星数据类型实现
Random
接口方面所做的努力吗。“在随机时间”不能很好地表示为
Random
实例。你是用函数式的反应式编程风格,还是用传统的“命令式循环”来编写游戏?在前一种情况下,您只需生成一个具有相等分布输入时间值的有序列表。否则,每当小行星出现时,你就必须从指数分布中抽出一个时间间隔,然后等待这个时间再生成下一个。