我正在尋找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
這個定義在源代碼中還有很多。這是怎麼回事?
我正在尋找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
這個定義在源代碼中還有很多。這是怎麼回事?
發生什麼事是這些函數不能在Haskell中實現,但它們應該出現在文檔中。由於haddock
需要每個簽名的語法正確(以及良好類型)定義,所以源必須包含僞定義。此外,在它們被定義的地方(在ghc-prim
包中),error
(因此undefined
)尚不可用,所以更明顯的seq = error "Not implementable in Haskell"
不能使用,因此是循環定義。
這些定義是一個詭計:它們是由GHC運行時提供的。事實證明,無限循環let x = x in x
可以被賦予任何類型,所以它與任何類型一樣是一個很好的定義。
有沒有原因'錯誤'*不能*早於'seq'和朋友定義? – 2011-12-28 21:11:47
'error'被定義爲'throw(ErrorCall message)',所以你需要'Exception'機制和'Typeable'。據我所知,它可以在'Exception'框架之外定義,直接使用'raise#'原語,但更適合與其他'Exception's匹配。所以爲了保持'ghc-prim'小,只提供'raise#',更復雜的東西進入'base'。簡而言之,它可以被定義得更早,但它不是很好,也沒有理由去做,GHC.Prim來源將是一個未使用的假人。 – 2011-12-28 22:19:04