将二进制转换为十进制

问题描述:

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

您正在尝试使用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

像哈马尔说你不能扭转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