十进制和二进制数处理

时间:2012-02-07 13:37:22

标签: haskell

我正在研究能够将十进制转换为二进制值的代码。与其他语言相比,haskell需要很少的代码才能实现这一点。下面是我编写的代码。

binaryToDec :: [Int] -> Int
binaryToDec [] = []
binaryToDec (x:xs) = (+) (x * 2 ^(length xs))

这段代码给出了一个我很难弄清楚的错误。但我不能。

Assignment.hs:61:18:
    Couldn't match expected type `Int' with actual type `[a0]'
    In the expression: []
    In an equation for `binaryToDec': binaryToDec [] = []

我该怎么办?

1 个答案:

答案 0 :(得分:11)

binaryToDec :: [Int] -> Int

这表示binaryToDec是一个函数,它以Int s的列表作为参数,并返回Int作为结果。

binaryToDec [] = []

这表示当binaryToDec参数为空列表时,其结果为空列表。

空列表不是Int,因此这是一个错误。

解决方案:决定binaryToDec []应评估的内容,并在等式的右侧使用它。

但那不是全部......

binaryToDec (x:xs) = (+) (x * 2 ^(length xs))

这表示当binaryToDec的参数为空列表时,其结果是将x * 2 ^(length xs)添加到的函数参数。

一个函数不是Int,所以这也是一个错误。

解决方案:找出要添加到x * 2 ^(length xs)的内容,然后添加它。


之前你被这样的错误信息困扰了。因此,让我们逐行解构错误消息:

  • Assignment.hs:61:18:

    这给出了编译器确定出错的行上的文件名,行号和大致位置。

  • Couldn't match expected type `Int' with actual type `[a0]'

    这意味着周围的上下文需要Int类型的值,但提供的值是[a0]类型。 (a0这里的意思是“不知道"”,因此编译器确定您已提供了一个列表,但尚未确定它是什么" sa列表。)

  • In the expression: []

    这是类型[a0]的表达式,但预计类型为Int。这并不总是你的错误 - 就在编译器发现错误的时候 - 但在这种情况下 你的错误是:[]显然不是Int

    (nb如果错误是等号左侧的[],则错误消息会引用模式 []而不是表达 []。)

  • In an equation for `binaryToDec': binaryToDec [] = []

    这只是为您提供了有关编译器发现错误的位置的更多信息。