유형 이름은 소문자로 시작할 수 없습니다. 여기 WordInt
에 wordInt
변경 : (AN Int
에 적용 할 때)
newtype wordInt = WI Int
Show
클래스의 방법 show
은 String
하고 helper
을 반환해야하는 유형 Int -> [Int]
있습니다. 당신은 어떻게 든 목록에 show
를 호출하여 예를 들면, String
으로 목록을 변환해야합니다
마지막으로
instance Show WordInt where
show (WI x) | x >= 0 = show $ helper x
| x < 0 = show $ helper (-x)
, 내가 괄호 안에 -x
을 넣어 통지. 이는 컴파일러가 x
을 helper
(함수이고, 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]
당신의 도우미 기능은 괜찮습니다 ('\''div'에서'''를 사용하는 것까지). 즉 입력을 개별 자릿수로 나누지 만 단어를 번역하지는 않습니다. 이것이 컴파일러가 불평하는 이유입니다. –
내가 스택에 추가했을 때 오타가되었습니다. 내 실제 코드는 'div'가 아니라 'div'이다. – Rick
그리고 -minInt == minInt를 잊지 마십시오. – augustss