通過在haskell編程書中練習,我不確定答案,並希望檢查我的理解。正常形式中的表達式(_,'b')?在弱頭正常形式?
的表達是:(_, 'b')
。
這是正常形式,弱頭正常形式,還是兩者都不?
下面是本書中列出的問題(#7)的屏幕截圖。
通過在haskell編程書中練習,我不確定答案,並希望檢查我的理解。正常形式中的表達式(_,'b')?在弱頭正常形式?
的表達是:(_, 'b')
。
這是正常形式,弱頭正常形式,還是兩者都不?
下面是本書中列出的問題(#7)的屏幕截圖。
遺憾的是,筆者做了一個錯誤的決定,在這些問題使用_
字符。正如@Alec所注意到的,代碼字符串(_,'b')
不是一個有效的Haskell表達式(因爲_
是隻能出現在模式中的保留標識符),所以詢問(_,'b')
是否處於正常形式(NF)或弱頭正常形式(WHNF )有點像問大象是在NF還是WHNF。它沒有任何意義。
如果問題反而詢問(x, 'b')
,那會是一個更好的問題。這是一個有效的Haskell表達式。我們可以告訴它是在WHNF中,因爲它的「頭」(表達式的最外面部分)是一個數據構造函數。在這種情況下,它是元組構造函數(,)
,它具有特殊的語法,所以它比平時稍微不明顯,但請注意,(x, 'b')
可以被重寫爲(,) x 'b'
,這表明「頭」是數據構造函數(,)
。但它不能在NF中,因爲x
沒有得到充分的評估(即沒有被它的值取代,這可能是其他地方給出的)。
相比之下,(1, 'b')
將在這兩個WHNF(因爲它的頭是數據構造(,)
)在NF 和因爲該數據構造被充分應用到的論點和每一個這些參數都得到了充分評估。
現在,我認爲這是作者預期是爲_
放置一個非常有效的表達的某個不確定的,未經評估的一部分,那麼他或她打算你有理由相信(_, 'b')
是WHNF(因爲腦袋數據構造函數(,)
),但不在NF中(因爲有一個未評估的部分_
浮動)。所以,「正確的」答案是「WHNF only」。
這有幫助嗎?
'_'不是有效的Haskell表達式。如果'(_,'b')'是你在GHCi中用':sprint'得到的,那麼這將是WNHF,因爲你知道表達式作爲一個整體是一個元組,但是並非表達式中的所有東西都被計算。 – Alec
這真的是書中的問題,還是他們詢問關於'(⊥,'b')',也許寫成'(_ | _,'b')'? –
@ K.A.Buhr問題已被編輯,包括書中列出的問題的屏幕截圖。 – mherzl