Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
在多个数据类型上使用System.Random-Haskell方法?_Haskell - Fatal编程技术网

在多个数据类型上使用System.Random-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,如下所

我试图以最“Haskell方式”学习Haskell,因此我试图避免像
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
的方式基本相同。