创建一个haskell函数,它返回整数列表列表中的平方和?

时间:2016-04-18 17:43:28

标签: haskell

我正在研究一个小练习题,我有一个haskell课程。它询问以下内容:

  

编写一个名为sumSquareMax的Haskell函数,它将Ints列表列表作为参数,   找到每个子列表的最大值,并返回这些最大值的平方和。

我已经想出如何在win hugs编译器中使用单独的代码行来完成它,但我真的想让它成为一个带参数的简单函数。我到目前为止的内容如下:

sumSquaresMax :: [[Int]] -> Int
sumSquaresMax x
    let maxes = map maximum x
    let squares = map (^2) maxes
    let finalSum = sum squares

因此,如果我首先运行sumSquaresMax [[4,2,5],[6,2],[2],[-6,4,1]],它会映射列表的最大值:[5,6,2,4]然后,它会对每个数字进行平方,然后对导致我答案的方块求和。

我如何进行“打印”finalSum?我知道这甚至不是正确的但我不完全确定从哪里开始。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果我理解你的例子,你的示例函数中应该只有一个let语句。 (虽然您可以有多个let语句,但这不是您的方法)。 let使您能够在函数中定义函数,这些函数是您不会在其他地方使用的一次性代码。

当您使用let时,您还必须包含in以提供该函数的实际返回值。

您还缺少用于定义功能体的=符号。

以下是我认为你要做的事情:

sumSquaresMax :: [[Int]] -> Int
sumSquaresMax x = 
    let maxes = map maximum x
        squares = map (^2) maxes
    in sum squares

答案 1 :(得分:2)

你真的在那里 - 你要做的就是取代名字:

sumSquaresMax x
= sum squares
= sum (map (^2) maxes)
= sum (map (^2) (map maximum x))
= sum . map (^2) . map maximum $ x
= sum . map ((^2) . maximum) $ x

总体来说:

sumSquaresMax = sum . map ((^2) . maximum)

示例:

Prelude> let sumSquaresMax = sum . map ((^2) . maximum)
Prelude> sumSquaresMax [[4,2,5],[6,2],[2],[-6,4,1]]
81