2014-12-10 3 views
1

저는 haskell을 처음 접하니 도움이 필요합니다. 나는 숫자 목록의 제곱의 합을 계산하는 매우 간단한 것을 썼다.목록의 중간 찾기 - Haskell

sumOfSquares:: [Integer] -> Integer 
sumOfSquares []  = 0 
sumOfSquares (x:xs) = x*x + sumOfSquares xs 

그래서 sumOfSquares는 [1..10] 나는이 목록의 중간을 발견하고 그 위에 단지 중간 요소와 모든 것을 'sumOfSquares'을 적용하는 방법과 사투를 벌인거야 385

것 .

위의 예를 사용하면 5 ~ 10 제곱의 합을 찾고 목록의 처음 절반 만 무시하고 싶을 것입니다.

splitAt를 사용하려고 생각했는데, 맞습니까? 나는 명백한 무엇인가 놓치고 있냐?

+0

'splitAt' 잘 될 것입니다, 당신은하지만 먼저 길이를 계산해야합니다. 이는 다소 비효율적이지만 10 요소에 대해서는 눈에 띄지 않습니다. – bheklilr

답변

1

또한이 예에서와 같이 drop을 사용할 수 있습니다 또한

sumOfSquares (drop len xs) 

, 당신의 sumOfSquares :

sumOfSquares $ drop len xs 

같이 동일이, 당신의 내용

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 

함수는 다음과 같이 다시 쓸 수 있습니다.

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) 
+0

이것은 대단히 도움이되었습니다. 감사합니다. – SMtalk