2011-12-28 6 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

なぜ 'error' *は' seq'や友人より早く定義できないのですか? –

+3

'error'は' throw(ErrorCall message) 'として定義されていますので、' Exception'メカニズムと 'Typeable'が必要です。私が知る限り、 'raise#'プリミティブを直接使用して'Exception'フレームワークの外で定義することができますが、他の 'Exception'と適合させる方が良いです。 'ghc-prim'を小さく保つために' raise# 'のみを提供するほど、より精巧なものが' base'に入ります。要するに、それはより早く定義することができますが、それほど素晴らしいものではありません.GHC.Primソースは、とにかく使用されないダミーです。 –

9

これらの定義は、ルーズであり、GHCランタイムによって最初に提供されます。無限ループlet x = x in xには任意の型を与えることができることが判明しています。

関連する問題