我正在研究能够将十进制转换为二进制值的代码。与其他语言相比,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 [] = []
我该怎么办?
答案 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)
添加到其1>的函数参数。
一个函数不是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 [] = []
这只是为您提供了有关编译器发现错误的位置的更多信息。