这是个问题:
"写的是计算列表的平均值的功能,即通过其长度划分列表中的所有元素的总和.(您可能需要使用fromIntegral功能列表的长度将从一个整数到浮点数.)"
首先我试过这个:
mean :: [Double] -> Double
mean [] = 0
mean (x:xs) = (x + mean xs) / (1 + mean xs)
Run Code Online (Sandbox Code Playgroud)
但它给了我奇怪的结果,例如,当我像这样使用它时:
mean [2,4,6]
Run Code Online (Sandbox Code Playgroud)
它给我的结果:1.41176
它应该是:4
为什么?
我尝试了另一件事:
mean :: [Double] -> Double
mean list = (summ list) / (count list)
where count [] = 0
count (x:xs) = 1 + count xs
summ [] = 0
summ (x:xs) = x + summ xs
Run Code Online (Sandbox Code Playgroud)
但是当我试图将文件加载到GHC时,我有一个错误.
错误是:
parse error on input 'count'
Failed, modules loaded: none
Run Code Online (Sandbox Code Playgroud)
再一次,我做错了什么?
最后,我尝试了这个(成功):
mean :: [Double] -> Double
count [] = 0
count (x:xs) = 1 + count xs
summ [] = 0
summ (x:xs) = x + summ xs
mean list = summ list / count list
Run Code Online (Sandbox Code Playgroud)
它与上面的那个相同(使用'where'关键字),但它只在这里成功,而不是在上面的那个.
为什么?
非常感谢.
ps
我正在从书中学习 - 真实世界Haskell和练习是从这里 - (滚动下来:-))
谢谢大家.这是一件奇怪的事.当我从这里复制并测试它时,第二个例子对我也有用.我不知道为什么它昨天对我不起作用:-)
但我仍然不明白为什么第一个不起作用.我认为它应该是那样的
(2 + mean [4,6]) / (1 + mean [4,6])
(4 + mean [6 ]) / (1 + mean [ 6])
(6 + mean [ ]) / (1 + mean [ ]) Run Code Online (Sandbox Code Playgroud)
所以现在就是这样
(6 + 0 ) / (1 + 0 ) -- last recursion
(4 + (6 + 0) ) / (1 + (1 + 0) )
(2 + (4 + (6 + 0))) / (1 + (1 + (1 + 0))
Run Code Online (Sandbox Code Playgroud)
所以现在它应该是:12/3
不是吗?
我不明白的是什么?
谢谢 :-).
您第一次尝试得到的答案错误,因为您使用的公式不正确.垃圾进垃圾出.(其他人已经介绍过这个.)
您可能会收到解析错误,因为某些行正在使用空格而其他行正在使用制表符.或者您正在使用所有选项卡,但使用非标准选项卡宽度.
此处不使用或不需要缩进,因此不会出现空格-v-制表符问题.
令平均值 x = sum (x) / fromIntegral(length(x))
平均值 [2.0, 4.0, 6.0]
当然,这必须改进(空列表,对双打确实有效......)。