簡體   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