2012-02-07 254 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) 

此代碼似乎很好,但出現錯誤。將二進制轉換爲十進制

解決此錯誤的任何解決方案? 謝謝

+2

你寫'putStrLn(「Foo」)'的方式有點奇怪。把'f'的函數'f'寫成'f x'更爲常見,所以在你的情況下'putStrLn「Foo」'更自然。 – gspr 2012-02-07 11:20:34

+0

謝謝。我會改變這個......再次感謝你 – JJ23 2012-02-07 11:33:26

回答

3

您正在嘗試使用reversex,這是一個Int(因爲它的binaryToDec的說法,你所賜給類型Int -> Int),但reverse的類型爲[a] -> [a],所以它只能在名單。

這基本上是編譯器裝置,什麼時,它說:「無法比擬預計在reverse第一個參數與實際類型Int[a]」。仔細閱讀錯誤信息是一個好主意,它們通常爲錯誤提供了很好的線索。

要解決此問題,您可能需要將x以某種方式轉換爲列表,或者更改函數以取代列表。

+0

瞭解一個現有的功能來做到這一點?我知道'map digitToInt $ show x'可以工作,但看起來有點ha。。 – Pubby 2012-02-07 11:22:58

+0

@Pubby:標準庫中沒有任何東西。儘管如此,Hackage上有一個[數字包](http://hackage.haskell.org/packages/archive/digits/0.2/doc/html/Data-Digits.html)。 – hammar 2012-02-07 11:36:09

1

像哈馬爾說你不能扭轉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 2012-02-07 11:38:24