【发布时间】:2010-01-08 12:40:01
【问题描述】:
这是个问题:
"写一个函数来计算 列表的平均值,即所有的总和 列表中的元素除以其 长度。 (您可能需要使用 fromIntegral 函数转换 整数列表的长度 转换为浮点数。)”
首先我尝试了这个:
mean :: [Double] -> Double
mean [] = 0
mean (x:xs) = (x + mean xs) / (1 + mean xs)
但它给了我奇怪的结果,例如,当我这样使用它时:
mean [2,4,6]
它给了我结果: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
但是当我尝试将文件加载到 GHC 时出现错误。
错误是:
parse error on input 'count'
Failed, modules loaded: none
再次,我做错了什么?
最后,我尝试了这个(成功):
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
和上面的一样(带有'where'关键字),但它只在这里成功,而不是在上面。
为什么?
非常感谢。
附言
我正在从这本书中学习——Real World Haskell
练习来自here——(向下滚动:-))
谢谢大家。 这是一件奇怪的事情。 当我从这里复制并测试它时,第二个示例也适用于我。 我不知道为什么昨天它对我不起作用:-)
但我仍然不明白为什么第一个不起作用。 我觉得应该是这样的
(2 + mean [4,6]) / (1 + mean [4,6])
(4 + mean [6 ]) / (1 + mean [ 6])
(6 + mean [ ]) / (1 + mean [ ])
现在是这样的
(6 + 0 ) / (1 + 0 ) -- last recursion
(4 + (6 + 0) ) / (1 + (1 + 0) )
(2 + (4 + (6 + 0))) / (1 + (1 + (1 + 0))
所以现在应该是:12 / 3
不是吗?
我不明白什么?
谢谢你:-)。
【问题讨论】:
-
为什么投反对票?这是一个写得很好的问题。他说明了他必须做什么,到目前为止他已经尝试过什么,以及他的问题是什么。
-
你的第二个例子对我有用。也许你的缩进是错误的?
-
另外,你不需要定义自己的计数函数,你可以使用内置的“长度”函数。
-
我知道我不需要定义计数函数,但我是初学者,想要从头开始:-)
-
实际上,RWH 中的前两个练习是对列表求和并计算列表的长度,作为学习简单递归的一种方式。 FWIW,第二个例子也适用于我。
标签: haskell