【发布时间】:2010-07-24 04:32:31
【问题描述】:
我有一个函数(Thompson 的函数式编程技巧中的练习 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
这是为什么?
【问题讨论】:
-
而不是“EDIT: Solved”,在这个网站上,礼仪是标记正确答案(在这种情况下,我的,因为它是唯一的,你认为问题已解决)通过单击复选标记“已接受”。
-
您可以使用
repeat d而不是widths d。
标签: haskell integration