亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

什么是弱頭正常形式?

什么是弱頭正常形式?

波斯汪 2019-07-25 15:03:52
什么是弱頭正常形式?什么是弱頭范式(WHNF)是什么意思?什么是頭標準型(HNF)和范式(NF)是什么意思?真實世界Haskell說:熟悉的seq函數將表達式計算為我們稱之為head normal form(縮寫為HNF)的表達式。它一旦到達最外面的構造函數(“頭部”)就會停止。這與正常形式(NF)不同,其中表達式被完全評估。您還將聽到Haskell程序員引用弱頭正常形式(WHNF)。對于正常數據,弱頭正常形式與頭部正常形式相同。差異只出現在功能上,而且我們在這里無關緊要。我已經閱讀了一些資源和定義(Haskell Wiki和Haskell郵件列表和自由詞典),但我沒有得到它。有人可能舉一個例子或提供外行定義嗎?我猜它會類似于:WHNF = thunk : thunk HNF = 0 : thunk  NF = 0 : 1 : 2 : 3 : []如何做seq和($!)與WHNF和HNF有關?更新我還是很困惑。我知道有些答案會忽略HNF。通過閱讀各種定義,似乎WHNF和HNF中的常規數據之間沒有區別。但是,它似乎與功能有所區別。如果沒有差異,為什么還seq需要foldl'?另一個混淆點來自Haskell Wiki,它指出seq減少到WHNF,并且對以下示例不做任何處理。然后他們說他們必須seq用來強制評估。那不是強迫它到HNF嗎?常見的新手堆棧溢出代碼:myAverage = uncurry (/) . foldl' (\(acc, len) x -> (acc+x, len+1)) (0,0)了解seq和弱頭正常形式(whnf)的人可以立即理解這里出了什么問題。(acc + x,len + 1)已經在whnf中,所以seq將值減少到whnf,對此無效。這段代碼將像原始的foldl示例一樣構建thunks,它們只是在元組內部。解決方案只是強制元組的組件,例如myAverage = uncurry (/) . foldl'            (\(acc, len) x -> acc `seq` len `seq` (acc+x, len+1)) (0,0)- Stackoverflow上的Haskell Wiki
查看完整描述

3 回答

?
狐的傳說

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

Haskell中關于Thunks和Weak Head Normal Form的部分Wikibooks 對懶惰的描述提供了對WHNF的非常好的描述以及這個有用的描述:

逐步評估值(4,[1,2])。第一階段完全沒有評估; 所有后續表格都在WHNF中,最后一個表格也是正常形式。


查看完整回答
反對 回復 2019-07-25
?
米脂

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

Haskell程序是表達式,它們通過執行評估來運行。

要評估表達式,請按其定義替換所有函數應用程序。你這樣做的順序并不重要,但它仍然很重要:從最外面的應用程序開始,從左到右進行; 這稱為懶惰評估。

例:

   take 1 (1:2:3:[])=> { apply take }
   1 : take (1-1) (2:3:[])=> { apply (-)  }
   1 : take 0 (2:3:[])=> { apply take }
   1 : []

當沒有更多功能應用程序需要更換時,評估停止。結果是正常形式(或縮小的正常形式,RNF)。無論您評估表達式的順序如何,您總是會以相同的正常形式結束(但僅在評估終止時)。

懶惰評估的描述略有不同。也就是說,它表示你應該只評估所有的弱頭正常形式。在WHNF中,表達式恰好有三種情況:

  • 構造函數: constructor expression_1 expression_2 ...

  • 一個內置函數,參數太少,比如(+) 2sqrt

  • lambda表達式: \x -> expression

換句話說,表達式的頭部(即最外面的函數應用程序)不能再進一步求值,但函數參數可能包含未評估的表達式。

WHNF的例子:

3 : take 2 [2,3,4]   -- outermost function is a constructor (:)(3+1) : [4..]        -- ditto\x -> 4+5            -- lambda expression

筆記

  1. WHNF中的“頭”不是指列表的頭部,而是指最外層的函數應用程序。

  2. 有時候,人們會將未評價的表達稱為“thunk”,但我認為這不是理解它的好方法。

  3. 頭部正規形式(HNF)與Haskell無關。它與WHNF的不同之處在于,lambda表達式的實體也在某種程度上得到了評估。


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 648 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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