2016-10-15 2 views
2

정수를 취하여 그 정수를 단어로 출력하는 코드를 작성하려고합니다. 예 : 입력이 4321이면 출력은 4 천 3 백 21입니다. 이를 위해 먼저 입력을 개별 숫자로 나누고 싶습니다. ex 입력 4321은 [4,3,2,1]의 배열이됩니다.int를 정수형으로 변환하려고 시도했습니다.

내 현재 코드 순간

newtype wordInt = WI Int 

instance Show WordInt where 
    show (WI x) | x>= 0 = helper x 
       | x < 0 = helper -x 

helper 0 = [0] 
helper x = x `mod` 10 : helper (x `div` 10) 

, 나는 내가 유형의 오류가 있다고 생각. 양수와 음수를 모두 입력 할 수 있어야합니다. 또한, 내가 찾고있는 변환을 효율적으로 수행 할 수있는 방법을 생각할 수 있다면, 대단히 감사하겠습니다.

+0

당신의 도우미 기능은 괜찮습니다 ('\''div'에서'''를 사용하는 것까지). 즉 입력을 개별 자릿수로 나누지 만 단어를 번역하지는 않습니다. 이것이 컴파일러가 불평하는 이유입니다. –

+0

내가 스택에 추가했을 때 오타가되었습니다. 내 실제 코드는 'div'가 아니라 'div'이다. – Rick

+0

그리고 -minInt == minInt를 잊지 마십시오. – augustss

답변

2

유형 이름은 소문자로 시작할 수 없습니다. 여기 WordIntwordInt 변경 : (AN Int에 적용 할 때)

newtype wordInt = WI Int 

Show 클래스의 방법 showString하고 helper을 반환해야하는 유형 Int -> [Int] 있습니다. 당신은 어떻게 든 목록에 show를 호출하여 예를 들면, String으로 목록을 변환해야합니다

마지막으로
instance Show WordInt where 
    show (WI x) | x >= 0 = show $ helper x 
       | x < 0 = show $ helper (-x) 

, 내가 괄호 안에 -x을 넣어 통지. 이는 컴파일러가 xhelper (함수이고, Int이 아님)에서 뺀 것으로 생각하기 때문에 단항 마이너스에 필요합니다.

그러나 반올림하여 숫자 목록을 반환하므로 helper 구현이 잘못되었습니다. 이 문제를 해결하려면, 당신은 숫자를 분할하는 도우미 함수를 쓴 후 목록 역 :이 뜻 패드를, 그러나 앞에 0과 수

helper :: Int -> [Int] 
helper = reverse . go 
    where go 0 = [0] 
      go x = x `mod` 10 : go (x `div` 10) 

을 :

λ. helper 4321 
[0,4,3,2,1] 

이하지 않습니다 물론, 의미를 변경할 수 있지만,이 문제가 될 경우,이 경우 처리하는 래퍼 함수 쓰기 : 그것은 다음 두 경우 모두에서 작동

helper :: Int -> [Int] 
helper x = 
    case splitIntoDigits x of 
     [] -> [0] 
     xs -> reverse xs 

splitIntoDigits :: Int -> [Int] 
splitIntoDigits 0 = [] 
splitIntoDigits x = x `mod` 10 : splitIntoDigits (x `div` 10) 

:

를3210
λ. helper 0 
[0] 
λ. helper 4321 
[4,3,2,1] 
+0

나는 당신의 도우미 구현이 잘못되었다는 것을 알아 차렸다. (오답을주는 의미에서). 나는 곧 내 대답을 업데이트 할 것이다. – dkasak

+0

역순으로 목록을 작성하는 것이 더 좋지 않습니까? 미리 생각해 보면, 십진수 앞의 자릿수를 처리하여 텍스트로 변환하는 것이 더 쉬울까요? – Rick

+0

"역순으로 목록을 작성하는 것"은 무엇을 의미합니까? 첫 번째 위치에서 역순으로 생성하는 것을 의미하는 경우 이것은 ((++)를 사용하여 추가 할 수는 있지만) 작은 쪽에서 큰쪽으로 (오른쪽에서 왼쪽으로) 처리하는 경우 비효율적입니다. 두 번째 질문에 대해서는 이미 10 자리 숫자 이전에 숫자 자릿수를 처리하고 있습니다.왼쪽에서 오른쪽으로 번호를 처리하는 것을 말 했습니까? – dkasak

관련 문제