第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Haskell 的無限列表, 底層實現(xiàn)是怎樣的?

Haskell 的無限列表, 底層實現(xiàn)是怎樣的?

縹緲止盈 2019-04-21 20:42:21
看到一個Scheme的實現(xiàn),用了delay這個函數(shù)...https://www.shido.info/lisp/scheme_lazy_e.html但是底層,比如說編譯到IR或者匯編,這種功能怎樣實現(xiàn)?
查看完整描述

2 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

惰性求值的底層其實是借助了thunk。粗淺的解釋就是一個求值用的函數(shù)和它的自由變量環(huán)境的結合。每一個表達式在其值被需要之前,總是先存儲為一個thunk,一旦其值必須要被求解出來,就強迫執(zhí)行求值過程。比如說,如果有這樣的列表:
list::[Integer]
list=[1..]
它首先會被實現(xiàn)為對系統(tǒng)函數(shù)enumFrom的調用,調用的結果類似這樣:
enumFrom::Integer->[Integer]
enumFromn=n:enumFrom(n+1)
list=enumFrom1
=1:enumFrom2
=1:2:enumFrom3
=1:2:3:enumFrom4
--onandon...
其中每個enumFrom的調用都會被實現(xiàn)為一個thunk。我們以take5list為例。take函數(shù)用(:)進行模式匹配,類似于:
take::Int->[a]->[a]
take0_=[]
taken(x:xs)=x:take(n-1)xs
take__=error"Invalidcalloftake."
需要對列表進行模式匹配時,將要求從thunk中匹配一個(:)運算符(構造器),這時thunk求值一層,從list展開成1:thunk2,模式匹配成功,取出了1。take函數(shù)會要求進一步匹配,新thunk(即thunk2)也會被求值,又產生新的thunk。當thunk中的值不再需要時,就不會進一步求值了。這樣,無窮的求解步驟就被拆分開來,總是用一個thunk來表達無窮的部分,就不會耗盡內存了。
                            
查看完整回答
反對 回復 2019-04-21
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

惰性計算(LazyEvaluation)是haskell的一大特點之一。無限列表也是LazyEvaluation的一種表現(xiàn)。它的底層實現(xiàn)感覺上沒那么重要吧。了解概念就OK了,反正它很快,O(1)的時間復雜度、空間復雜度。
                            
查看完整回答
反對 回復 2019-04-21
  • 2 回答
  • 0 關注
  • 637 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號