Haskell学习练习给出了奇怪的结果

Azr*_*iel 6 haskell

这是个问题:

"写的是计算列表的平均值的功能,即通过其长度划分列表中的所有元素的总和.(您可能需要使用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
不是吗?
我不明白的是什么?
谢谢 :-).

dav*_*420 5

  1. 您第一次尝试得到的答案错误,因为您使用的公式不正确.垃圾进垃圾出.(其他人已经介绍过这个.)

  2. 您可能会收到解析错误,因为某些行正在使用空格而其他行正在使用制表符.或者您正在使用所有选项卡,但使用非标准选项卡宽度.

  3. 此处不使用或不需要缩进,因此不会出现空格-v-制表符问题.


dan*_*tel 0

令平均值 x = sum (x) / fromIntegral(length(x))

平均值 [2.0, 4.0, 6.0]

当然,这必须改进(空列表,对双打确实有效......)。