将二进制转换为十进制

时间:2012-02-07 11:11:08

标签: haskell

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 个答案:

答案 0 :(得分:3)

您尝试在reverse上使用x,这是Int(因为它是binaryToDec的参数,您已将其赋予{{1}类型}}),但Int -> Int的类型为reverse,因此它仅适用于列表。

这基本上是编译器在“[a] -> [a]”的第一个参数中“无法将预期类型[a]与实际类型Int匹配时的含义”。仔细阅读错误信息是个好主意,它们通常可以提供错误的线索。

要解决此问题,您可能希望以某种方式将reverse转换为列表,或者更改函数以取代列表。

答案 1 :(得分: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,该怎么办?