2014-12-30 4 views
0
sumAllDigits :: [ Int ] -> Int 
sumAllDigits (x:xs) 
    |(x:xs) == [] = 0 
    |x >= 10 = sumDigits x + sumAllDigits xs 
    |x< 10 = x + sumAllDigits xs 

REPORT :
* 재귀> sumAllDigits [22,33] *** 예외 : Recursion.hs (76,1) - (79,34) : 비 소모적 함수 sumAllDigits의 패턴하스켈 재귀의 비 소모적

+8

'x : xs'가'[]'과 어떻게 같을 수 있습니까? (힌트 : 같은 방법으로 1은 0과 같을 수 있습니다.) – leftaroundabout

답변

1

나는 다음과 같은 변경 사항으로 인해 문제가 해결 될 것으로 믿습니다. 필자는 일치하는 일치하는 자체 구현 인 빈 목록의 경우를 선호합니다. 그냥 나에게 더 명백한 느낌. 그리고 나서 x>=에 빠지며 그보다 작을 경우 해당 사례를 처리합니다.

sumAllDigits :: [ Int ] -> Int 
sumAllDigits [] = 0 
sumAllDigits (x:xs) 
    | x >= 10 = sumDigits x + sumAllDigits xs 
    | otherwise= x + sumAllDigits xs 
+4

아마 문제가 해결 될 것 같지만 문제가 무엇인지 설명하고 문제를 어떻게 해결할 수 있는지에 대한 답은 더 유용 할 것입니다. – icktoofay

+0

이렇게 편집되었습니다. 미안합니다. 모바일에서 앱이 다운되거나 연결이 끊어진 경우 유용한 정보를 먼저 게시하는 것을 선호합니다. :) –

+2

"빈 목록의 경우에 맞춰서 일치하는 자체 구현을하는 것을 선호합니다."- 실제로 이것은 좋은 충고입니다.하지만 여기에서는 더 강력하게 말할 수 있습니다 :'x : xs'가 유일한 절인 경우 함수 _ 빈리스트와 결코 일치 할 수 없음! – leftaroundabout