2011-12-28 31 views
15

我正在尋找seq的定義,並遇到了這種奇怪。爲什麼所有這些函數都有相同/相似的定義?通過前奏的源代碼帶來了奇怪

seq :: a -> b -> b 
seq = let x = x in x 

inline :: a -> a 
inline = let x = x in x  

lazy :: a -> a 
lazy = let x = x in x 

這個定義在源代碼中還有很多。這是怎麼回事?

回答

21

發生什麼事是這些函數不能在Haskell中實現,但它們應該出現在文檔中。由於haddock需要每個簽名的語法正確(以及良好類型)定義,所以源必須包含僞定義。此外,在它們被定義的地方(在ghc-prim包中),error(因此undefined)尚不可用,所以更明顯的seq = error "Not implementable in Haskell"不能使用,因此是循環定義。

+1

有沒有原因'錯誤'*不能*早於'seq'和朋友定義? – 2011-12-28 21:11:47

+3

'error'被定義爲'throw(ErrorCall message)',所以你需要'Exception'機制和'Typeable'。據我所知,它可以在'Exception'框架之外定義,直接使用'raise#'原語,但更適合與其他'Exception's匹配。所以爲了保持'ghc-prim'小,只提供'raise#',更復雜的東西進入'base'。簡而言之,它可以被定義得更早,但它不是很好,也沒有理由去做,GHC.Prim來源將是一個未使用的假人。 – 2011-12-28 22:19:04

9

這些定義是一個詭計:它們是由GHC運行時提供的。事實證明,無限循環let x = x in x可以被賦予任何類型,所以它與任何類型一樣是一個很好的定義。