无法将预期类型"a"与实际类型"[a]"匹配

Bob*_*law 11 haskell

我能够完美地执行以下代码

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

但是我收到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
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*man 15

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

[a]Haskell 中的类型列表包括类型a和尾部的头部,类型列表[a].cons构造函数:将head和tail作为参数.

当您解构列表时(x:y),x是头部并且y是尾部.所以在你的第二个代码片段中,当你的类型签名要求你返回一个类型的值(头部是一个例子)时,你绑定列表的尾部,它具有列表类型.[a]a


use*_*038 6

了解:真正的内容将有助于解密错误消息.:可以被认为是一个带有元素和列表的函数,并返回一个列表,其第一个元素是第一个参数,其余部分是第二个参数,或者:

(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

你写道myLast :: [a] -> a,找到你的功能; 但是,类型myLast (_:x) = xmyLast :: [a] -> [a]因为:(你命名x)的第二个参数本身就是一个列表.

另外,一般来说,当你不了解Haskell中的某些东西时,你应该首先看看它:t在GHCI中使用的类型.