haskell错误中的高阶函数

时间:2012-02-07 06:16:36

标签: haskell

selectMenu :: Int->IO() 
selectMenu num
        |(num==1)=convertFromDecimal
        |(num==2)=--menu2
        |(num==3)=putStrLn("3")
        |(num==4)=putStrLn("4")
        |(num==5)=putStrLn("5")


convertFromDecimal:: IO()
convertFromDecimal= do 
            putStrLn("\n\tConvert From Decimal To Binary & Octals \n")
            putStrLn("----------------------------------------------------------\n")
            putStrLn("Enter 5 decimal numbers [,,] : ")
            input<-getLine
            let n=(read input)::[Int] -- is this right?
            --putStrLn (show n)
            let result = convertionTO decToOct n
            putStrLn(show result)`



decToOct :: Int -> [Int]
decToOct x = reverse(decToOct' x)
            where
        decToOct' 0 = []
        decToOct' y = let (a,b) = quotRem y 8 in [b] ++ decToOct' a




convertionTO :: (Int -> [Int] -> [Int]) -> [Int] -> [Int]
convertionTO _ [] = []  
convertionTO f (x:xs) = f x : convertionTO f xs

我纠正了这些错误。我纠正了这些错误后确实更新了问题。但这一次它给出了这个错误 我该如何解决这个错误?

Assignment.hs:49:51:
    Couldn't match expected type `[Int] -> [Int]'
                with actual type `[Int]'
    Expected type: Int -> [Int] -> [Int]
      Actual type: Int -> [Int]
    In the first argument of `convertionTO', namely `decToOct'
    In the expression: convertionTO decToOct n
Assignment.hs:66:25:
    Couldn't match expected type `Int'
                with actual type `[Int] -> [Int]'
    In the return type of a call of `f'
    In the first argument of `(:)', namely `f x'
    In the expression: f x : convertionTO f xs

2 个答案:

答案 0 :(得分:2)

(我在这里复制错误,以防您再次编辑问题。)

第一个错误

Assignment.hs:49:51:
    Couldn't match expected type `[Int] -> [Int]'
                with actual type `[Int]'
    Expected type: Int -> [Int] -> [Int]
      Actual type: Int -> [Int]
    In the first argument of `convertionTO', namely `decToOct'
    In the expression: convertionTO decToOct n

指的是这行代码

            let result = convertionTO decToOct n

conversionTO期望其第一个参数的类型为Int -> [Int] -> [Int],但decToOct的类型为Int -> [Int]

第二个错误

Assignment.hs:66:25:
    Couldn't match expected type `Int'
                with actual type `[Int] -> [Int]'
    In the return type of a call of `f'
    In the first argument of `(:)', namely `f x'
    In the expression: f x : convertionTO f xs

指的是这行代码

convertionTO f (x:xs) = f x : convertionTO f xs

convertionTO生成[Int],因此:的第一个参数必须是Int。但是,f x的类型为[Int] -> [Int]

如何解决这些问题?

我将假设您的第49行是正确的,并且convertionTO的类型签名是错误的。在那种情况下它应该是

convertionTO :: (Int -> [Int]) -> [Int] -> [Int]

这不能解决第二个错误,因为f x现在有[Int]类型。

这里的问题是您使用::将单个元素连接到列表的开头。你有两个你想要加入的列表。为此,请使用++

convertionTO f (x:xs) = f x ++ convertionTO f xs

最后,请注意,您的convertionTOconcatMap标准库中,将mapconcat结合在一起。

答案 1 :(得分:1)

这些错误意味着您指的是不存在的功能。要么是因为你的名字输入错误,要么是因为你还没有定义它们。

例如,代替showresult,您可能意味着show result,我认为您的意思是decToOct'而不是decToAny'。我无法在您发布的代码中的任何位置看到对convertToDecimal的任何引用,因此该错误可能位于其他位置。