我正在研究一个小练习题,我有一个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
?我知道这甚至不是正确的但我不完全确定从哪里开始。非常感谢任何帮助!
答案 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