سؤال

طريقة واحدة لحساب 2 ^ 8 في Haskell هي بالكتابة

product(replicate 8 2)

عند محاولة إنشاء وظيفة لهذا، يعرف على النحو التالي ...

power1 :: Integer →  Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)

أحصل على الخطأ التالية:

Couldn't match expected type 'Int' against inferred type 'Integer'

تخميني هو أنني يجب أن أستخدم وظيفة fointeger في مكان ما ... أنا لست متأكدا أين أو كيف؟ هل هي واجهة أو ما هو fointeger، وكيف يمكنني استخدامه؟

شكرا

هل كانت مفيدة؟

المحلول

أولا، لا تستخدم أبدا frominteger. استخدم fointegral.

يمكنك أن ترى حيث يكون خطأ النوع من خلال النظر في نوع النسخ المتماثل:

replicate :: Int -> a -> [a]

لذلك عند GIV IT 'K' كحجة، قمت بتأكيد عدد صحيح عن طريق إعلان النوع، لدينا خطأ من النوع.

سيكون نهج أفضل لهذا استخدام GreaticReplicate:

genericReplicate :: (Integral i) => i -> a -> [a]

وماذا بعد:

power1 n k = product (genericReplicate k n)

نصائح أخرى

ربما يكون الحل الأكثر بساطة هو تغيير تعريف نوع الوظيفة إلى:

power1 :: Integer -> Int -> Integer

يجب عليك إلقاء نظرة على بقية رسالة الخطأ أيضا، فهي تخبرك بالضبط الإجابة على سؤالك:

Couldnt match expected type 'Int' against inferred type 'Integer'
In the first argument of 'replicate', namely 'k'
In the first argument of 'product', namely '(replicate k n)'
In the expression: product (replicate k n)

"في الحجة الأولى من النسخ المتماثل". هذا هو المكان المناسب لإضافة fromIntegral.

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