2017-09-01 189 views
1

通過在haskell編程書中練習,我不確定答案,並希望檢查我的理解。正常形式中的表達式(_,'b')?在弱頭正常形式?

的表達是:(_, 'b')

這是正常形式,弱頭正常形式,還是兩者都不?


下面是本書中列出的問題(#7)的屏幕截圖。

enter image description here

+2

'_'不是有效的Haskell表達式。如果'(_,'b')'是你在GHCi中用':sprint'得到的,那麼這將是WNHF,因爲你知道表達式作爲一個整體是一個元組,但是並非表達式中的所有東西都被計算。 – Alec

+0

這真的是書中的問題,還是他們詢問關於'(⊥,'b')',也許寫成'(_ | _,'b')'? –

+0

@ K.A.Buhr問題已被編輯,包括書中列出的問題的屏幕截圖。 – mherzl

回答

3

遺憾的是,筆者做了一個錯誤的決定,在這些問題使用_字符。正如@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」。

這有幫助嗎?

+0

很多工具(主要是調試器)將未評估的「漏洞」列爲_。不過,我確實認爲它應該在之前被定義過。 – HTNW

+0

你可以自己寫成'_',甚至用'-fdefer-typed-holes'運行代碼(在這種情況下,它們的行爲就像未定義的那樣)。作者或許可以更好地解釋他們希望讀者如何在這些練習中處理'_'(我想如果我們正在考慮他們打出漏洞,那麼他們不能以正常形式出現,因爲評估它們會爆炸?),但是'(_,'b')'不是一個有效的表達式並不是真的。 – Ben