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