Я новичок в Haskell, и я пишу программу, которая вычисляет предел функции. Поэтому, учитывая два списка a
и b
, дельта dx = 0.001
и пределы интегрирования l
и r
, я хочу, чтобы рекурсивно вычислить площадь под кривой с уравнением: a1(x)^b1 + a2(x)^b2 + ... + an(x)bn
где x
это все значения между l
r
с приращением dx
между каждым значением. Техническая часть не так важна, я думаю, но это помогает читать код:Нет экземпляра для (Fractional Int), возникающего из-за использования `area '
import Text.Printf (printf)
-- This function should return a list [area].
solve :: Int -> Int -> [Int] -> [Int] -> [Double]
solve l r x y = [area l r x y]
area l r a b = if (l < r)
then (calc l a b) * 0.001 + (area (l + 1) r a b)
else (calc r a b) * 0.001
calc n (a:arest) (b:brest) = (fromIntegral(n) ^^ b) * fromIntegral(a) + (calc n arest brest)
calc n [] [] = 0
--Input/Output.
main :: IO()
main = getContents >>= mapM_ (printf "%.1f\n"). (\[a, b, [l, r]] -> solve l r a b). map (map read. words). lines
я не получаю сообщение об ошибке с указанным кодом, но как только я меняю area (l + 1) r a b
к area (l + 0.001) r a b
я получаю следующее сообщение об ошибке:
No instance for (Fractional Int) arising from a use of `area'
Я пробовал сделать новый класс и иметь абстрактный тип, но это не сработало, никаких других идей?
Try добавления сигнатуры типов для всех функций верхнего уровня. Это также поможет вам определить, какие аргументы должны быть целыми и какие из них должны быть удвоены, например. – chi