Haskell 将数字列表平方,然后除以列表的平均值

Haskell 将数字列表平方,然后除以列表的平均值,haskell,Haskell,我需要将数字列表平方,然后除以列表的平均值。到目前为止,我得到了: square :: Float -> Float square x = x * x s2 :: [Float] -> Float s2 xs = map square (map (\c -> c - mean) xs) 任何帮助都是非常感谢的 s2 :: [Float] -> Float s2 xs = sum $ map ((/mean).(^2)) xs where mean= sum xs

我需要将数字列表平方,然后除以列表的平均值。到目前为止,我得到了:

square :: Float -> Float
square x = x * x

s2 :: [Float] -> Float
s2 xs = map square  (map (\c -> c - mean) xs)
任何帮助都是非常感谢的

s2 :: [Float] -> Float
s2 xs = sum $ map ((/mean).(^2)) xs
  where mean= sum xs / fromIntegral (length xs)
测试:


这个问题还不清楚,但我假设你的意思是将平方的和除以平均值。简单版本:

sumOfSquaresOverMean :: Fractional a => [a] -> a
sumOfSquaresOverMean as = sum (map (^2) as) / mean as

mean :: Fractional a => [a] -> a
mean as = sum as / fromIntegral (length as)

这确实有一个缺点,那就是该列表将被遍历三次。加布里埃尔·冈萨雷斯(Gabriel Gonzalez)的文章讨论了一种可能的解决方案,但它更高级,因此您现在可能想跳过它。

请解释是什么阻止您完成您的方法。你面临的困难是什么?什么是“列表平方”?正如您所看到的,
square
采用
Float
,而不是
[Float]
。我可以使用以下简单函数来实现:map square(map(\c.c-mean)[3,4,5])sum$$,但无法在.hs程序中运行示例。对不起,我是新手。我才做了4个星期。另外,我不能使用递归。@symon将其分解为几个函数。有一个函数可以对列表进行平方运算,有一个函数可以计算列表的平均值,有一个函数可以从列表中的每个元素中减去一个数字,然后可以开始组合它们。然后,您可以创建一个函数来计算列表的平均值,并从每个元素中减去该数字。然后你可以做一个函数,将每个元素平方,并将其输入到我描述的最后一个函数中。我首先要澄清“除以平均数”中的“它”是什么,以及“列表平方”的含义。您可能需要为不同的列表指定不同的名称-例如,您的意思可能是“对列表中的每个元素进行平方运算以获得正方形列表,然后将正方形列表中的每个元素除以原始列表的平均值”。+1表示对冈萨雷斯的引用-我仍然需要对它进行调整,以使其正确匹配,并且当老师给你完全错误的答案时。感谢上帝,他做到了。
sumOfSquaresOverMean :: Fractional a => [a] -> a
sumOfSquaresOverMean as = sum (map (^2) as) / mean as

mean :: Fractional a => [a] -> a
mean as = sum as / fromIntegral (length as)