惰性求值的底層其實是借助了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)xstake__=error"Invalidcalloftake."需要對列表進行模式匹配時,將要求從thunk中匹配一個(:)運算符(構(gòu)造器),這時thunk求值一層,從list展開成1:thunk2,模式匹配成功,取出了1。take函數(shù)會要求進一步匹配,新thunk(即thunk2)也會被求值,又產(chǎn)生新的thunk。當(dāng)thunk中的值不再需要時,就不會進一步求值了。這樣,無窮的求解步驟就被拆分開來,總是用一個thunk來表達無窮的部分,就不會耗盡內(nèi)存了。