我有一个函数(在汤普森的函数函数编程的练习10.11),它计算函数在域(a,b)上的定积分值的近似值。它可能不是最优雅的功能,但我还是一个初学者:等效表达式在函数中产生不同的结果?
import Data.Ratio (Rational, (%), denominator, numerator)
type R = Rational
integrate :: (R -> R) -> R -> (R, R) -> R
integrate f d (a, b) = foldr (+) 0 $ zipWith (*) (map f [a, a + d..b]) (widths d)
where widths :: R -> [R]
widths = \n -> n : widths n
eval :: R -> Double
eval = \r -> (/) (fromIntegral $ numerator r) (fromIntegral $ denominator r)
例如,
eval $ integrate (\x -> 20 + x^2) (1%10000) (-3%1, 3%1) =
~> 138.00290001
现在,widths d
应相当于表达[d..]
。但是,如果我用集成中的[d ..]替换宽度,我的函数会输出不正确的值。例如:
integrate' :: (R -> R) -> R -> (R, R) -> R
integrate' f d (a, b) = foldr (+) 0 $ zipWith (*) (map f [a, a+d..b]) [d..]
eval $ integrate' (\x -> 20 + x^2) (1%10000) (-3%1, 3%1)
~> 41400870141.0029
这是为什么?
而不是“**编辑:**解决”,在这个网站上的礼仪,以纪念通过点击复选标记,正确的答案(在这种情况下,我的,因为它是唯一一个,你认为问题已解决)为“接受”。 – 2010-07-24 04:47:31
你可以使用'repeat d'而不是'widths d'。 – sastanin 2010-07-24 11:55:52