您能告诉我如何在我的代码中修复此错误吗?
{--------------------- BINARY TO DECIMAL MENU ---------------}
functionBinToDecimal:: IO()
functionBinToDecimal= do
putStrLn("\n\tConvert Binary To Decimal\n")
putStrLn("----------------------------------------------------------\n")
putStrLn("\t\tEnter a binary number : ")
input<-getLine
let n=(read (reverse input))::String
let result = convertionFrom binaryToDec n
putStrLn(show result)
{----------------BINARY TO DECIMAL---------------------}
binaryToDec :: String -> Int
binaryToDec = foldr (\x s -> s * 2 + x) 0 . reverse . map charToInt
where charToInt x = if x == '0' then 0 else 1
conversionFrom :: (String -> Int) -> String -> Int
conversionFrom _ [] = 0
conversionFrom f (x:xs) = f x ++ conversionFrom f xs
错误
test.hs:28:27:
Couldn't match expected type `Int' with actual type `[a0]'
In the expression: f x ++ conversionFrom f xs
In an equation for `conversionFrom':
conversionFrom f (x : xs) = f x ++ conversionFrom f xs
答案 0 :(得分:2)
其他提示:您无需撤消,只需使用foldl
代替foldr
,例如
binaryToDec = foldl (\n c -> 2*n + if c=='1' then 1 else 0) 0
答案 1 :(得分:1)
convertionFrom :: (String -> Int) -> String -> Int
说你的第一个参数是一个带字符串的函数......
convertionFrom f (x:xs) = f x ++ convertionFrom f xs
是模式匹配,取第二个参数(一个字符串),并将x
绑定到字符串的头部(一个字符)。
所以f
需要一个字符串,但你传给它一个字符。
答案 2 :(得分:1)
嗯,你根本不需要conversionFrom功能。计算十进制格式二进制文件的工作是binaryToDec,单独使用它就可以了。
答案 3 :(得分:0)
您需要将f x
的结果添加到递归调用中。您现在正尝试将结果添加到前面。
尝试:
convenrtionFrom f (x : xs) = f x + convertionFrom f xs
答案 4 :(得分:0)
问题是++
是列表连接,而不是添加 - 它期望并返回列表,但是你正在传递它并期望返回。那就是convertionFrom
的重点是什么? binaryToDec n
应该将字符串形式的二进制数转换为int而不会出现问题。将binaryToDec
传递给convertionFrom
可能不对,因为在convertionFrom
上调用binaryToDec
并且字符串会将字符传递给binaryToDec
,这将导致另一种类型错误,如米克尔所述。
答案 5 :(得分:0)
其他附加提示:已经有一个函数可以将String
转换为Int
(实际上,任何Num
个实例),其名称为Numeric.readInt
。这是一个需要两个函数参数的HOF,所以它比foldl
更好!
您可以使用Char.digitToInt
将数字Char
转换为Int
(而不是charToInt
)。