在多个数据类型上使用System.Random-Haskell方法?
我试图以最“Haskell方式”学习Haskell,因此我试图避免像在多个数据类型上使用System.Random-Haskell方法?,haskell,Haskell,我试图以最“Haskell方式”学习Haskell,因此我试图避免像dos和lets这样的模糊事实 因此,我有一个名为Org的数据类型,在中定义为: data Org=Org {pos::Pos2D ,颜色::颜色 }派生(显示) 其中Color和Pos2D的定义如下: --实际上不是这样定义的,它是Graphics.Gloss.Data.Color 数据颜色=颜色浮动 数据Pos2D=Pos2D浮点 现在我为Pos2D实现了UniformRange,为Color实现了Uniform,如下所
do
s和let
s这样的模糊事实
因此,我有一个名为Org
的数据类型,在中定义为:
data Org=Org
{pos::Pos2D
,颜色::颜色
}派生(显示)
其中Color
和Pos2D
的定义如下:
--实际上不是这样定义的,它是Graphics.Gloss.Data.Color
数据颜色=颜色浮动
数据Pos2D=Pos2D浮点
现在我为Pos2D
实现了UniformRange
,为Color
实现了Uniform
,如下所示:
实例UniformRange Pos2D
哪里
uniformRM(位置2D x1 y1,位置2D x2 y2)g=位置2D
uniformRM(x1,x2)g
uniformRM(y1,y2)g
实例统一颜色
哪里
uniformM g=g.makeColor
uniformRM(0.0,1.0)g
uniformRM(0.0,1.0)g
uniformRM(0.0,1.0)g
返回1.0
给定一个Pos2D
(表示边界的角点)元组,它将返回一个均匀分布在这些元组之间的随机Pos2D
。对于Color
,它将返回一个随机颜色,具有统一的R、G和B值,但具有固定的alpha=255(1.0)
现在的问题是,如何创建组织
randomOrg::RandomGen g=>g->Org
randomOrg=--。。。
哪里
gen=mkStdGen 1337
我遇到的问题是uniformR
和uniformM
获取g
并返回(a,g)
的元组。因此,我不确定最干净、最“哈斯凯利”的方式是如何将这些调用链接在一起创建组织
有什么想法吗?谢谢
编辑:
我知道我可以做到这一点:
randomOrg::RandomGen g=>g->Org
randomOrg g=组织位置颜色
哪里
(位置,g1)=uniformR(位置2D 0 0,位置2D 720 480)g
(颜色,g2)=均匀g1
但我不喜欢这个,原因很明显
编辑2:
经过思考,我想我需要的函数应该是这样的
pUniform
:(均匀a,随机g)
=>(a->b,g)->(g->(a,g))->(b,g)
但我不确定
编辑3:
现在我想函子可能是相关的:
()::(函子f)=>(a->b)->fa->fb
因此,如果我们取一些函数(a->b)
(可以是Org
构造函数),我们将一些a
包装在上下文f
中,就像(a,g)
,那么我们可以生成一个b
包装在上下文中,这将是(b,g)
。对我来说似乎是对的,但我不确定如何将其转换为实际代码。如前所述,最好的方法是使用新的一元接口:
randomOrg :: StatefulGen g m => g -> m Org
randomOrg g = Org <$> uniformR (Pos2D 0 0, Pos2D 720 480) g <*> uniform g
虽然这种方法更通用,但您也可以使用可变状态在IO
中运行它:
randomOrg'' :: RandomGen g => IOGenM g -> IO Org
randomOrg'' = randomOrg
(警告:这些应该可以工作,但我自己没有仔细检查过;如果发现任何潜在错误,请告诉我!)如上所述,最好的方法是使用新的一元接口:
randomOrg :: StatefulGen g m => g -> m Org
randomOrg g = Org <$> uniformR (Pos2D 0 0, Pos2D 720 480) g <*> uniform g
虽然这种方法更通用,但您也可以使用可变状态在IO
中运行它:
randomOrg'' :: RandomGen g => IOGenM g -> IO Org
randomOrg'' = randomOrg
(警告:这些应该可以工作,但我自己没有仔细检查;如果发现任何潜在错误,请告诉我!)换句话说:您执行此操作的方式与实现
uniformRM
和uniformM
的方式基本相同。换句话说:您执行此操作的方式与实现uniformRM
和uniformM
的方式基本相同。