2011-01-19 5 views
0

함수는 목록의 누적 합계를 반환해야합니다. [1,2,3,5]으로 전화하는 것은 [1,3,6,11]을 반환합니다. 내가 GHcI에서 실행하면, 그것은 나를 보여줍니다하스켈에서 scanl1 정보

sumlist' :: [xx]=[xx] 
sumlist' []=[] 
sumlist' [x]=x 
sumlist' xx=scanl1 (+) [xx] 

내가 여러 선언을 할 것을 :

나는이 기능을 다음과 같이 썼다. 그렇다면이 함수에 어떤 문제가 있습니까?

+0

코드 샘플 태그를 사용하여 하스 켈 코드를 더 읽기 좋게 만드십시오. –

+0

@Zach L : 포스터 [않았다] (http://stackoverflow.com/revisions/2c4cc0fb-9ac7-4112-b119-3911f779f113/view- 소스)하지만 코드 샘플 앞뒤에 개행 문자가 없기 때문에 작동하지 않습니다. 이제 해결되었습니다. –

+1

마지막 줄 만 있으면됩니다. 다른 두 개는 중복됩니다 (실제로 두 번째는 유형 오류입니다). – sepp2k

답변

4

첫째을, 당신은

sumlist' :: [xx]->[xx] 

처럼 뭔가 선언을 변경하고 싶습니다.

scanl1을 호출 할 때 (+)를 사용하고 있으므로 Num 유형이 필요하므로 sumlist '의 정의로 돌아가서 특별히 목록을 가져와야한다고 알려야합니다. 수의.

sumlist' :: Num xx=>[xx]->[xx] 

scanl1는거야, 당신은 여전히, 단지 차기에 대한 코드를 시도하려는 경우 그래서 당신이 필요, 그러나

sumlist' :: Num xx=>[xx]->[xx] 
sumlist' xx = scanl1 (+) xx 


입니다, 빈리스트를 해결할 수있는 마지막 두 줄을 수정해야합니다 :

x가 요소를 포함하는 경우에 대해, 사용자는

,
sumlist' [x] = x 

기억, 그래서 그냥 다시 목록을 반환, sumlist은 '목록을 받아 는 목록을 반환!

sumlist' [x] = [x] 

그리고 당신은 XX라는 목록을 마지막 경우에 대한

, 그렇게, GHC는 [xx]이 목록의 목록입니다 생각 있도록

sumlist' xx=scanl1 (+) [xx] 

xx는 이미 목록이

: 그래서 우리의 수정 된 코드가 같은 것이 단지 괄호

sumlist' xx=scanl1 (+) xx 

을 제거

sumlist' :: Num xx=>[xx]->[xx] 
sumlist' []=[] 
sumlist' [x]=[x] 
sumlist' xx=scanl1 (+) xx 

ephemient으로 말하면 GHCi에 여러 줄을 입력해야하는 경우 : load 명령을 사용하십시오.

이 도움이 희망과 행복 해킹이 귀하의 질문에 직접 대답하지

+0

안녕하세요,이 설명은 매우 명확 하 고 감사합니다 !! !! – CathyLu

+0

Nitpicking : 당신은': {'과':}'을 사용할 수 있습니다. GHC 7.0부터는 레이아웃까지 지원합니다. – fuz

0
sumlist' :: [xx]=[xx] 

그 라인이 잘못되었습니다. :: 뒤에 오는 부분은 형식 선언이어야합니다 (예 : [a] -> [a]). (예, 패턴/값 [xx] 같은 을 보이지만하지 않습니다.)

는 별도로 각 입력 라인을 취급, GHCi에 여러 줄의 선언을 입력하지 마십시오. 그냥 파일에 저장하고 :load GHCi의 파일에 저장하십시오. sumlist가 '형 XX의 목록을 받아 형 XX의 목록을 반환 이후

0

:-)하지만, 고차 함수를 사용하여 sumList을 정의 할 수있는 더 좋은 방법은 다음과 같습니다

sumList :: (Num a) => [a] -> [a] 
sumList = tail . scanl (+) 0 

또한 명백한 실수 인 =에 대한 ->에 대한 유형 서명이 "too polymorphic"이었을 것이라는 점에 유의하십시오. 이는 "모든 유형의 목록"이 아닌 "Num 클래스의 일부 유형"목록에서만 작동한다는 것입니다.