【发布时间】:2017-11-27 13:22:23
【问题描述】:
我正在关注 Learn You A Haskell 这本书来学习 Haskell,但我无法理解 randoms 函数。书中将函数定义为:
randoms' :: (RandomGen g, Random a) => g -> [a]
randoms' gen = let (value, newGen) = random gen in value:randoms' newGen
现在我看到这个函数的方式是它递归地调用自己并将返回值附加到列表value。我不明白的是函数是如何返回的,因为每次它只是用一个新的随机种子调用自己!
【问题讨论】:
-
不,因为懒惰,尾巴在你需要之前不评估。
-
不记得具体的函数,但如果它创建了一个惰性无限随机数列表,您可以从无限列表中
take获取一些元素。请注意,该函数不会一次全部评估;它只根据需要产生值。查看repeat函数以查看另一个示例。 -
@1-_- 你想得太严格了。你知道 Python 生成器是什么吗?
-
@1-_- 好的,很好。我只是想说,在使用无限列表时,您可以认为它的值是一次一个
yielded,而不是一次返回整个列表。我强烈建议深入研究并习惯懒惰,因为 Haskell 广泛使用它。 -
@1-_- 我不知道我是否可以写一个很好的解释,因为我使用 Haskell 已经有一段时间了,而且这是一个很难深入研究的话题。这只是最好的比较,可能有助于改变你的观点。
标签: haskell