2012-02-07 4 views
0
selectMenu :: Int->IO() 
selectMenu num 
     |(num==2)=convertBinToDecimal 



convertBinToDecimal:: IO() 
convertBinToDecimal= do 
      putStrLn("\n\tConvert Binary To Decimal\n") 
      putStrLn("----------------------------------------------------------\n") 
      putStrLn("Enter 5 binary numbers [,,] : ") 
      input<-getLine 
      let n=(read input)::Int 
      --putStrLn (show n) 
      let result = convertionTO binaryToDec n 
      putStrLn(show result) 

이 코드는 괜찮은 것처럼 보이지만 오류가 있습니다.바이너리를 십진수로 변환

이 오류를 수정하는 방법은 무엇입니까? 당신은 Int입니다 xreverse를 사용하려는

+2

'putStrLn ("Foo")'라고 쓰는 방법은 다소 이상합니다. 'x'에 적용된 함수'f'를'fx'로 작성하는 것이 훨씬 더 일반적입니다. 그래서'putStrLn "Foo"'는 훨씬 더 자연 스럽습니다. – gspr

+0

감사합니다. 나는 그것을 바꿀 것이다 ... 다시 고마워한다 – JJ23

답변

3

주셔서 감사합니다 (당신이 유형 Int -> Int을 준 binaryToDec의 인수 이후)하지만에서만 작동하므로 reverse는 유형 [a] -> [a]있다 기울기.

이것은 컴파일러가 "reverse의 첫 번째 인수에 실제 유형 Int과 예상 유형 [a]을 일치시킬 수 없다"는 것을 의미합니다. 오류 메시지를주의 깊게 읽는 것이 좋습니다. 오류 메시지를 자주 읽는 것이 좋습니다.

이 문제를 해결하려면 x을 어떻게 든 목록으로 변환하거나 함수를 변경하여 목록을 가져오고 싶을 것입니다.

+0

그 일을하는 기존의 기능을 안다? 나는'map digitToInt $ show x'가 작동하지만 hackish라고 생각합니다. – Pubby

+0

@Pubby : 표준 라이브러리에는 없습니다. 하지만 Hackage에는 [digits 패키지] (http://hackage.haskell.org/packages/archive/digits/0.2/doc/html/Data-Digits.html)가 있습니다. – hammar

1

hammar처럼 당신은 Int을 뒤집을 수 없습니다. 어떻게 든 목록으로 전화 번호를 변환해야합니다. :: Int -> [Int]

여기에 몇 가지 불편 함이 있습니다.

listToNum :: [Int] -> Int 
listToNum = foldl1 ((+) . (*10)) 

numToList :: Int -> [Int] 
numToList n | n <= 9 = [n] 
      | otherwise = numToList (n `div` 10) ++ [n `mod` 10] 

그리고 당신은 reverse $ numToList x 대신 reverse x처럼 사용할 수 있습니다.

그리고 단지 메모. selectmenu 함수가 모든 가능한 경우와 일치하지 않습니다. num이 2가 아니면 어떻게됩니까?

+0

아 그래. 이 프로그램의 다른 부분이 진행 중입니다. (힌트 : 아직도 쓰고있다) – JJ23

관련 문제