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)
这段代码似乎很好。但是有一个错误。
解决此错误的任何解决方案? 谢谢
答案 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,该怎么办?