2017-03-24 1 views
1
digits :: Int->Int->Int 
digits x y 
    |x`mod`10 == y`mod`10 = count x y 
    |otherwise = digits (x`div`10) (y`div`10) 

count :: Int -> Int -> Int 
k = 0 + 1 
count x y 
    |x < 1 = getprize k 
    |otherwise = digits (x`div`10) (y`div`10) 

getprize :: Int -> Int 
getprize k 
     |k == 8 = 1000000 
     |k == 7 = 100000 
     |k == 6 = 8000 
     |k == 5 = 300  
     |k == 4 = 20 
     |k == 3 = 5 
     |k == 2 = 1 
     |k < 2 = k 
     |otherwise = 43 

그래서이 코드를 하스켈에 작성했습니다. 목표는 입력 숫자 x, y가 얼마나 많은 숫자를 검색하고 카운터를 설정하려고 할 때입니다 (내 코드에서 k) 정수로 등록 된 k와 getprize를 호출 할 수 없습니다. 얼마나 많은 자릿수가 같은지 계산할 수 있도록 카운터를 int로 설정하는 방법은 무엇입니까?haskell의 카운터 설정 및 증분

+5

기본으로 돌아가서 다른 언어에 대해 알고있는 모든 것을 잊어 버리고, haskell을 배워야한다고 생각합니다. 이 질문은 haskell의 작동 방식에 대한 모든 것에 대한 엄청난 혼란을 보여줍니다. 그것은 실제로 당신이 익숙한 것과 실제로 다릅니다. 여기에 영향을 미치려고하는 패턴은 매우 위험합니다. – Carl

+0

실제로 정수형이 되시겠습니까? 아니면 정수형으로 만들까요? – leftaroundabout

+2

@ Carl, 그게 학습 효과가 있다면. 구체적으로 어떤 아이디어를 수정해야하는지 알려주도록하십시오. – luqui

답변

3

나는 당신이 당신의 코드에서 뭘 하려는지 이해 말할 수는 없지만, 내가 ("하스켈 카운터 설정하고 그것을 증가") 제목 질문에서 발생하는 근본적인 오해를 해결할 수 있다고 생각

하스켈의 모든 값은 변경 불가능합니다. 즉, 설정 한 후에는 변경할 수 없습니다. k = 0 + 1을 쓸 때, 그것은 누군가가 k을 볼 때마다 그들이 실제로 0 + 1을 의미한다는 것을 알게 될 때마다 영원히 남는다는 것을 의미합니다. 물론 이것은 1과 같습니다. 이 때문에 함수의 반복마다 k 값을 변경할 수 없습니다.

다음은 하스켈에서 반복을 시뮬레이트하기 위해 재귀를 사용하는 예입니다. 이 함수는 숫자를 가지고 0으로 끝까지 그 숫자보다 작거나 같은 모든 숫자를 추가합니다 :

sumLessThan :: Int -> Int 
sumLessThan 0 = 0 
sumLessThan k = k + sumLessThan (k - 1) 

을 지금은 sumLessThan 3을 평가하는 경우, 우리는 두 번째 함수 정의를 사용하여보고 3을 대체 할 수 있습니다 ksumLessThan 3 = 3 + sumLessThan (3 - 1)입니다. 당신은, 우리는 별도의 값을 추적하는 데 그 기반으로 결과를 계산하지 않습니다 볼 수 있듯이

sumLessThan 3 
3 + sumLessThan (3 - 1) 
3 + sumLessThan 2 
3 + (2 + sumLessThan (2 - 1)) 
3 + (2 + sumLessThan 1) 
3 + (2 + (1 + sumLessThan 0)) 
3 + (2 + (1 + 0)) 
3 + (2 + 1) 
3 + 3 
6 

, 우리가 측면에서 결과 을 계산된다 : 우리가 계속하면, 우리는 결국 실제 결과를 찾을 수 더 작은 결과기본 사례 인에 도달 할 때까지 점점 작아지고 작아지며 이는 쉽게 계산할 수 있습니다. 우리의 기본 경우는 sumLessThan 0 = 0

하스켈에서 "루프"를 작성할 때 따라야 할 올바른 패턴입니다. 별도의 "반복자"값을 사용하지 마십시오.

관련 문제