【发布时间】:2015-07-15 18:45:12
【问题描述】:
我是 Haskell 的新手,我正在编写一个计算函数极限的程序。因此,给定两个列表a 和b,一个增量dx = 0.001,以及积分限制l 和r,我想用方程递归地计算曲线下的面积:
a1(x)^b1 + a2(x)^b2 + ... + an(x)bn 其中x 是l 和r 之间的所有值,每个值之间的增量为dx。我猜技术部分并不重要,但它有助于阅读代码:
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'
我尝试创建一个新类并设置一个抽象类型,但没有奏效,还有其他想法吗?
【问题讨论】:
-
尝试向所有顶级函数添加类型签名。例如,这也将帮助您澄清哪些参数应该是整数,哪些应该是双精度数。
标签: haskell recursion types casting functional-programming