将二进制转换为十进制
问题描述:
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)
此代码似乎很好,但出现错误。将二进制转换为十进制
解决此错误的任何解决方案? 谢谢
答
您正在尝试使用reverse
上x
,这是一个Int
(因为它的binaryToDec
的说法,你所赐给类型Int -> Int
),但reverse
的类型为[a] -> [a]
,所以它只能在名单。
这基本上是编译器装置,什么时,它说:“无法比拟预计在reverse
第一个参数与实际类型Int
型[a]
”。仔细阅读错误信息是一个好主意,它们通常为错误提供了很好的线索。
要解决此问题,您可能需要将x
以某种方式转换为列表,或者更改函数以取代列表。
答
像哈马尔说你不能扭转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
你写'putStrLn(“Foo”)'的方式有点奇怪。把'f'的函数'f'写成'f x'更为常见,所以在你的情况下'putStrLn“Foo”'更自然。 – gspr 2012-02-07 11:20:34
谢谢。我会改变这个......再次感谢你 – JJ23 2012-02-07 11:33:26