因为这两种说法并不相同。想想我打电话时会发生什么
widths d
:
widths d = d : widths d
= d : d : widths d
...
= [d, d, d, ...]
换句话说,你会得到一个无限的
d
s。然而,
[d..]
返回列表
[d, d+1, d+2, ...]
d
s、 你可以写
[d,d..]
[d,d+n..]
创建无限列表
[d, d+n, d+2*n, ...]
repeat d
; 重复有签名
a -> [a]
,然后无限重复它的论点。
编辑:
function = \x -> ...
与相同
function x = ...
在所有情况下。也没有特别的理由写你的
eval
带前缀的函数
/
eval r = (fromIntegral $ numerator r) / (fromIntegral $ denominator r)
; 但事实上,我只会用
fromRational :: Fractional a => Rational -> a
函数而不是
. 您也可以替换
foldr (+) 0
sum
. 你不需要创建一个无限的
s,然后乘以所有;更简单的说,你可以
sum . map (* d) $ map f [a, a + d..b]
integrate'' :: (R -> R) -> R -> (R,R) -> R
integrate'' f d (a,b) = d * (sum $ map f [a, a+d .. b])`
然后我们有
> fromRational $ integrate'' (\x -> 20 + x^2) (1%10000) (-3%1, 3%1)
138.00290001