سؤال

أنا أتعلم هاسكل. لقد أنشأت وظيفة التي تُرجع جدول الضرب إلى "N" في القاعدة "B". الأرقام مبطنة لأرقام 'w'. كخطوة الأخيرة ، أريد حساب "W" تلقائيًا. لماذا هذا لا يجمع؟

-- 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))
هل كانت مفيدة؟

المحلول

يأخذ logbase معلمتين تنفذ typeclass العائمة. ستحتاج إلى الاتصال من integral على المعلمات قبل تمريرها إلى قاعدة الأجل. تم تجميع هذا لي بـ 6.10.3:

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

عليك أن تتذكر أن Haskell يتم كتابتها بشدة ، لذلك لا يمكنك فقط افتراض أن المعلمات int التي يتم توفيرها تلقائيًا يتم إجبارها على الأرقام العائمة التي تتخذها وظائف السجل عمومًا.

نصائح أخرى

logBase يُعلن أنه يعمل على أنواع النقاط العائمة. INT ليس نوعًا من النقطة العائمة وهناك لا يوجد تحويل تلقائي في هاسكل. جرب هذا:

-- 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)))

من المقدمة:

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

وهذا يعني أن استخدام قاعدة الأجل يجب أن تستخدم نوعًا عائمًا. لكن INT ليس نوعًا عائمًا ، ولا يوجد تحويل تلقائي لأنواع رقمية ، لذلك عليك تحويله من int إلى نوع عائم:

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

تأخذ وظيفة toenum int كمعلمة وإرجاع نوع "التعداد". الجزء الجيد هو أن التعويم هو مثال على التعداد ، لذلك يمكنك استخدامه

toEnum :: Enum a => Int -> a

يجب عليك قراءة/توثيقك حول فئات النوع القياسية في Haskell لأنواع رقمية (num ، fractional ، integral ، floating ...) لأنها غالبًا ما تكون منبثقة في التعليمات البرمجية ، يمكن أن تكون تحويلات التعلم مفيدة.

تحرير: هذا كتاب هاسكل ويكي توفير رسم مفيد للغاية للعلاقة بين فئة نوع المعايير ، بما في ذلك الأنواع الرقمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top