कारण प्रकार हस्ताक्षर
sumOfDigits :: Int -> Int
sumOfDigits n = sum $ map digitToInt (show n)
उपयोग
sumOfDigits :: Integer -> Int
है और आप GHCi में के रूप में एक ही बात हो जाएगा (आप क्या चाहते हैं)।
Int
मशीन शब्द आकार "ints" थोड़ी देर के लिए प्रकार है, Integer
गणितीय सही, मनमाने ढंग से सटीक Integers
के लिए प्रकार है।
अगर आप GHCi में टाइप
:t product [1..100]
आप मिल जाएगा की तरह
product [1..100] :: (Enum a, Num a) => a
कि है, किसी भी प्रकार Enum और अंक प्रकार वर्गों के उदाहरण है कि के लिए कुछ, product [1..100]
एक मूल्य हो सकता है उस प्रकार के
product [1..100] :: Integer
93326215443944152681699238856266700490715 लौटना चाहिए 968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 जो आपकी मशीन से कहीं अधिक बड़ी है, आपकी मशीन पर एक शब्द के रूप में प्रतिनिधित्व करने में सक्षम होने की संभावना है। शायद, क्योंकि रोल के
से अधिक
product [1..100] :: Int
वापस आ जाएगी 0
इस को देखते हुए, आप सोच सकते हैं
sum $ map Data.Char.digitToInt (show (product [1..100]))
जाँच टाइप नहीं है, क्योंकि यह कई संभव असंगत व्याख्याओं है। लेकिन, कैलकुलेटर के रूप में उपयोग करने योग्य होने के लिए, हास्केल इस तरह की स्थितियों में Integer
का उपयोग करने के लिए डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से आपके व्यवहार को समझाता है।
उसी कारण से, यदि आप नहीं sumOfDigits
एक स्पष्ट प्रकार हस्ताक्षर यह किया होता कि आप क्या चाहते दिया था, के बाद से सबसे सामान्य प्रकार
sumOfDigits :: Show a => a -> Int
है