繁体   English   中英

Haskell中的“随机”功能如何工作?

[英]How does the `randoms` function in Haskell work?

我正在学习“学习Haskell”一书以学习Haskell,但在理解randoms函数方面遇到困难。 本书将功能定义为:

randoms' :: (RandomGen g, Random a) => g -> [a]  
randoms' gen = let (value, newGen) = random gen in value:randoms' newGen    

现在,我看到此函数的方式是它递归调用自身并将返回值附加到列表value 我不明白函数是如何返回的,因为每次它只是用一个新的随机种子调用它自己时!

我认为令人困惑的部分可能是在返回值中使用了:

value:randoms' newGen 

这是一个列表,具有value的第一项,列表的其余部分是对randoms' newGen进行递归调用所返回randoms' newGen

我不明白函数是如何返回的,因为每次它只是用一个新的随机种子调用它自己时!

由于懒惰,只有在您尝试访问返回列表的第二个(或更高版本)项时,它才会自行调用。 此列表既不在,也不能在内存中。 Haskell中的列表更像是配方...在尝试访问元素之前,Haskell不会尝试确定其含义。

作为粗略的比较,不要尝试思考如何返回无限列表,而是考虑Python生成器如何“返回”无限列表:通过一次yield一个元素(根据需要)来实现。

整个列表不会一次返回。 每个元素都会根据需要进行评估,并且该函数只会根据需要进行递归。

注意,我并不是说Haskell的惰性与Python的生成器的工作方式相同,但是在考虑这些函数时,记住这一点可能是一个有用的比较。

请参阅其他答案以获取有关为什么发生这种情况的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM