2009-12-28 25 views
8

मैं हास्केल सीख रहा हूं। मैंने फ़ंक्शन बनाया है जो बेस 'बी' में 'एन' तक गुणा तालिका लौटाता है। संख्या 'डब्ल्यू' अंकों के लिए गद्देदार हैं। अंतिम चरण के रूप में, मैं स्वचालित रूप से 'डब्ल्यू' की गणना करना चाहता हूं। यह संकलन क्यों नहीं करता है?कोई उदाहरण नहीं (फ़्लोटिंग इंट)

-- Number of digits needed for the multiplication table n*n in base 'base' 
nOfDg :: Int -> Int-> Int 
nOfDg n base = 1 + floor (logBase base (n*n)) 

त्रुटि:

No instance for (Floating Int) 
    arising from a use of `logBase' at C:\haskel\dgnum.hs:4:24-38 
    Possible fix: add an instance declaration for (Floating Int) 
    In the first argument of `floor', namely `(logBase b (n * n))' 
    In the second argument of `(+)', namely `floor (logBase b (n * n))' 
    In the expression: 1 + floor (logBase b (n * n)) 

उत्तर

10

logBase दो पैरामीटर जो चल typeclass लागू लेता है। लॉगबेस पर पास करने से पहले आपको पैरामीटर पर इंटेग्रल से कॉल करने की आवश्यकता होगी। यह 6.10.3 के साथ मेरे लिए संकलित:

nOfDg :: Int -> Int-> Int 
nOfDg n base = 1 + floor (logBase (fromIntegral base) (fromIntegral (n*n))) 

आप को याद है कि हास्केल बहुत मजबूती से लिखा गया है, तो आप सिर्फ कल्पना नहीं कर सकते कि इंट मापदंडों अपने कार्य करने के लिए आपूर्ति की स्वचालित रूप से चल नंबरों के लिए मजबूर हो जाएगा वह लॉग फ़ंक्शन आम तौर पर लेते हैं।

5

logBase फ़्लोटिंग पॉइंट प्रकारों पर काम करने के लिए घोषित किया गया है। Int एक फ़्लोटिंग पॉइंट प्रकार नहीं है और no automatic conversion in Haskell है। प्रस्तावना से

-- Number of digits needed for the multiplication table n*n in base 'base' 
nOfDg :: Int -> Float -> Int 
nOfDg n base = 1 + floor (logBase base (fromIntegral (n*n))) 
+0

मुझे लगता है कि आपको '(इंटेग्रल बेस) से भी आवश्यकता होगी। –

+0

@ जेसन: उस प्रकार के साथ दान ने उस समारोह को नहीं दिया, आप नहीं करेंगे। – Chuck

+0

हाँ, इस पर निर्भर करता है कि आप इसका उपयोग कैसे करना चाहते हैं। या तो ऐसा करें जैसे कि मेरे पास टाइप हस्ताक्षर बदलने के लिए ठीक है, या अगर एंडी का संस्करण नहीं है तो इसका उपयोग करें। –

3

: इस प्रयास करें

logBase :: Floating a => a -> a -> a 

इसका मतलब है कि logBase का उपयोग कर आप एक अस्थायी प्रकार का उपयोग किया जाना चाहिए। लेकिन इंट एक अस्थायी प्रकार नहीं है, और वहाँ सांख्यिक प्रकार के लिए कोई स्वत: परिवर्तन है, तो आप इंट से कन्वर्ट करने के लिए एक अस्थायी प्रकार है:

nOfDg n base = 1 + floor (logBase (toEnum base) (toEnum n)) 

toEnum समारोह पैरामीटर के रूप में एक पूर्णांक लेने के लिए और वापस जाने के लिए एक " Enum "प्रकार। अच्छा बात यह है कि फ्लोट Enum का एक उदाहरण है, ताकि आप इसे

toEnum :: Enum a => Int -> a 

आप पढ़ना चाहिए/इस्तेमाल कर सकते हैं सांख्यिक प्रकार (अंक, आंशिक, के लिए हास्केल में मानक प्रकार कक्षाओं के बारे में आप दस्तावेज़ इंटीग्रल, फ्लोटिंग ...) क्योंकि वे अक्सर कोड में पॉप-अप करते हैं, सीखने के रूपांतरण उपयोगी हो सकते हैं।

संपादित करें: यह Haskell Wiki Book संख्यात्मक प्रकार सहित मानक प्रकार वर्ग के बीच संबंधों का एक बहुत ही उपयोगी ग्राफिक प्रदान करता है।

संबंधित मुद्दे