首先,类型必须以大写字母开头。如果他们不这样做,他们会解释为类型变量
stdDev :: [Float] -> Float
stdDev [] = 0.0
接下来,你并不需要所有这些fromIntegral
在里面,你是不是有Integral
类型的工作。如果我们使用where子句计算长度,我们也可以得到更高效的函数。不幸的是你不太使用foldl
正确的,它需要两个参数的函数,你只能通过它的1.功能也有你的标准偏差功能有点过了,它应该看起来像
stdDev xs = sqrt $ (sum $ map (^2) xs)/l - (sum xs/l)^2
where l = fromIntegral $ length xs
作为最后的改进,可以使这项工作对于实现Floating
任何类型,其中包括Float
和Double
是用一种类
stdDev :: Floating a => [a] -> a
stdDev [] = 0
stdDev xs = sqrt $ (sum $ map (^2) xs)/l - (sum xs/l)^2
where l = fromIntegral $ length xs
因此,我们可以测试一下:
> stdDev [1, 1, 1]
0.0
> stdDev [2, 4, 4, 4, 5, 5, 7, 9]
2.0
所以它看起来像它的工作
如果你真的想使用折叠,你必须通过它的功能有两个参数。在使用一般的模式是
foldl (\acc x -> <expr>) <initial value> <list>
对于总和,它是作为
foldl (\acc x -> acc + x) 0 xs
简单但性能方面的原因,你应该实际使用foldr
在这里,它可以减少到只需
foldr (+) 0 xs
在你的情况下,你需要一个简单的总和,然后一个平方和,所以你可以做
mySum xs = foldr (+) 0 xs
sumSqrs xs = foldr (\acc x -> acc + x^2) 0 xs
所以,你可以在stdDev
作为
stdDev xs = sqrt $ foldr (\acc x -> acc + x^2) 0 xs/l - (foldr (+) 0 xs/l)^2
where l = fromIntegral $ length xs
正如我告诉@大卫。我我强迫自己使用foldl ..我想我有两个paras,第一个是函数,第二个是0,这是累积值? –
你传递给'foldl'的函数必须有两个参数,但是现在它们都只有一个:'x'。 –
@NobWong看看我的编辑 – bheklilr