2012-06-24 9 views
7

के बीच अलग-अलग परिणाम प्रोजेक्ट यूलर पर समस्या 20 कर रहे हैं - 100 के अंकों का योग ढूंढना! (फैक्टोरियल, उत्साह नहीं)।इंटरैक्टिव और संकलित हास्केल (प्रोजेक्ट यूलर 20)

import Data.Char 

main = print $ sumOfDigits (product [1..100]) 

sumOfDigits :: Int -> Int 
sumOfDigits n = sum $ map digitToInt (show n) 

मैं ghc -o p20 p20.hs के साथ संकलित और यह मार डाला, केवल 0 मेरी कमांड लाइन पर हो रही है:

यहां कार्यक्रम मैंने लिखा है।

पहेली खेलना, मैं ghci लागू और निम्न पंक्ति भाग गया:

sum $ map Data.Char.digitToInt (show (product [1..100]))

यह सही जवाब लौट आए। संकलित संस्करण क्यों काम नहीं किया?

उत्तर

15

कारण प्रकार हस्ताक्षर

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 
है
संबंधित मुद्दे