我是哈斯凯尔的新手,我需要一些帮助。我写了一些非常简单的东西来计算数字列表的平方和。
sumOfSquares:: [Integer] -> Integer
sumOfSquares [] = 0
sumOfSquares (x:xs) = x*x + sumOfSquares xs
所以sumOfSquares [1..10]将是385。
我正在努力寻找如何找到列表的中间部分并将'sumOfSquares'仅应用于中间元素及其上方的所有元素。
所以使用上面的例子,我只想找出5-10的平方和,忽略列表的前半部分。
我正在考虑使用splitAt,我是否沿着正确的路线?我错过了一些明显的东西吗?
答案 0 :(得分:1)
您也可以在此示例中使用drop
:
sumOfSquares:: [Integer] -> Integer
sumOfSquares [] = 0
sumOfSquares (x:xs) = x*x + sumOfSquares xs
sumOfSecondHalf xs = sumOfSquares $ drop len xs
where len = length xs `div` 2 - 1
有关您的信息:
sumOfSquares $ drop len xs
与:
相同sumOfSquares (drop len xs)
此外,您的sumOfSquares
功能可以通过以下方式重写:
square :: Integer -> Integer
square x = x * x
sumOfSquares:: [Integer] -> Integer
sumOfSquares = sum . map square
其中map
将函数square应用于列表的每个元素,sum
返回列表的总和。
和此:
sumOfSquares = sum . map square
与:
相同sumOfSquares xs = sum (map square xs)