كيفية استخدام fromitteger في haskell؟
سؤال
طريقة واحدة لحساب 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
.