2013-06-03 105 views
8

我能够执行下面的代码完美无法匹配预期的类型'一“与实际类型`[A]”

myLast :: [a] -> a 
myLast [] = error "Can't call myLast on an empty list!" 
myLast (x:_) = x 

,但我发现这个错误Couldn't match expected type `a' with actual type `[a]'. `a' is a rigid type variable bound by the type signature for myLast :: [a] -> a以下代码:

myLast :: [a] -> a 
myLast [] = error "Can't call myLast on an empty list!" 
myLast (_:x) = x 

我是Haskell的初学者,错误信息太过于希腊语和拉丁语。根据我的理解,编译器无法在第二种情况下推断出类型。有人能指出我在这里发生了什么吗?

回答

13

您声明的输入是类型为[a]的列表,其余的类型为a

Haskell中的类型a的列表由a类型的头和尾部,[a]类型的列表组成。缺点构造函数:以头部和尾部为参数。

当您将一个列表解构为(x:y)时,x是头部,而y是尾部。因此,在您的第二个代码片段中,当您的类型签名要求您返回类型为a(头部为一个示例)的值时,您绑定列表的尾部,该列表具有列表类型[a]

6

有什么:真的是会帮助解密错误消息的理解。 :可以被认为是它接受一个元素和列表的功能,并返回一个列表,它的第一个元素是第一个参数,它的其余部分是第二个参数,或者:

(:) :: a -> [a] -> [a] 

前往您的功能,你写了myLast :: [a] -> a;然而,myLast (_:x) = x的类型为myLast :: [a] -> [a],因为:(您命名为x)的第二个参数本身就是一个列表。

此外,一般来说,当你不明白Haskell中的某些东西时,应该首先在GHCI中使用:t来看看它的类型。

相关问题