[英]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.