为什么随机monad函数需要一个额外的参数?

问题描述:

tutorial的单子,在部分一个更复杂的副作用:随机数,笔者提供的随机函数的签名如下所示:为什么随机monad函数需要一个额外的参数?

random :: StdGen -> (a,StdGen) 

但随后接着说:

这样一个功能,在概念上是随机函数a → b可以 写成函数
a -> StdGen -> (b,StdGen)
其中StdGen是种子的 类型。

签名开头的额外a是从哪里来的?为什么这种类型不像以前那样简单StdGen -> (a, StdGen) ???

感谢

+1

这些是两个不同的功能。一个需要'StdGen'并返回随机生成器的结果以及新的状态。然后他说,“如果我们有一个随机变异a'的函数,你会得到......”,然后是第二个签名。 – GManNickG 2012-07-26 17:01:55

+0

哦,好吧!随机变异的解释清楚地表明了这一点。谢谢。 – drozzy 2012-07-26 17:12:26

+0

@GManNickG你可以把这个答案,我可以接受吗? – drozzy 2012-07-31 12:35:36

这不一样,因为这是他描述的两种不同的功能。 :)

第一个需要StdGen并返回随机生成器的结果以及新状态。

然后他说:“所以如果我们有一个随机变化a的函数(到b),你会得到......”然后是第二个签名。

我想这意味着aa -> b参数和随机bStdGen -> (b, StdGen)StdGen -> (a, StdGen)只会给你一个随机a