سؤال

أنا أعلم نفسي haskell.

أريد أن أكتب دالة تجد بشكل متكرر الرقم الأول الذي يحتوي على جذر مربعة عدد صحيح وهو أصغر من رقم البداية.

تبدو هكذا:

findFirstSquare :: Int -> Int
findFirstSquare x
    | x <= 0                                  = error "This function only works for 1 or above"
    | fromInteger(floor(sqrt(x))) == (sqrt x) = x
    | otherwise                               = intSqrt(x - 1)

لكن GHC يشكو:

لا مثيل ل (Realfrac Int) الناشئ عن استخدام "الكلمة" في ...

ومع ذلك، إذا قمت بكتابة ما يلي إلى GHCI، فإنه يجمع بسعادة ذلك:

 fromInteger(floor(sqrt(4))) == (sqrt 4)

سؤالي هو: لماذا أحصل على خطأ من النوع من تعبير يجمع بنجاح في GHCI؟

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

المحلول

حسنا، أنا أحسب ذلك.

الفرق هو أن الثابت "4" مثقلة، لذلك SQRT تفاعلي (4) هو الحصول على الجذر التربيعي لل يطفو 4

ومع ذلك وظيفتي تعلن X ك إتجاه, ، لذلك كنت بحاجة إلى إضافة fointegral إلى المكالمات إلى SQRT، بحيث سيعملون.

تغيير الحرس الأوسط إلى ما يلي

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top