haskell Error2中的高阶函数

时间:2012-02-08 06:34:45

标签: haskell

您能告诉我如何在我的代码中修复此错误吗?

{--------------------- 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

6 个答案:

答案 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)。