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

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

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

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

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

2 回答

?
寶慕林4294392

TA貢獻2021條經(jīng)驗 獲得超8個贊

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

TA貢獻1799條經(jīng)驗 獲得超6個贊

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號