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

무슨 일이 일어나는지는 하스켈에서 이러한 기능을 구현할 수 없지만 문서에 나타나야한다는 것입니다. 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은 어떤 유형이 주어질 수 있으므로 어떤 루스 정의와 마찬가지로 좋습니다.

관련 문제