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

क्या कोई कारण 'त्रुटि' * को 'seq' और दोस्तों से पहले परिभाषित नहीं किया जा सकता है? –

+3

'त्रुटि' को 'फेंक (त्रुटि कॉल संदेश)' के रूप में परिभाषित किया गया है, इसलिए इसके लिए आपको 'अपवाद' तंत्र और 'टाइप करने योग्य' की आवश्यकता है। इसे 'अपवाद' ढांचे के बाहर परिभाषित किया जा सकता है, सीधे 'raise #' आदिम का उपयोग करके, जहां तक ​​मुझे पता है, लेकिन यह अन्य 'अपवाद' के साथ फिट होना अच्छा है। तो 'ghc-prim' छोटा रखने के लिए, केवल' raise # 'प्रदान करता है, अधिक विस्तृत सामग्री 'आधार' में जाती है। संक्षेप में, यह _could_ पहले परिभाषित किया गया था, लेकिन यह उतना अच्छा नहीं है, और ऐसा करने का कोई अच्छा कारण नहीं है, 'जीएचसी.प्रिम' स्रोत वैसे भी एक अप्रयुक्त डमी होगा। –

9

ये परिभाषाएं एक तर्कसंगत हैं: वे जीएचसी रनटाइम द्वारा प्राथमिक रूप से प्रदान की जाती हैं। यह पता चला है कि अनंत लूप let x = x in x किसी भी प्रकार का दिया जा सकता है, इसलिए यह किसी भी तरह की रूज परिभाषा के रूप में अच्छा है।