我能够完美地执行以下代码
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
了解:
真正的内容将有助于解密错误消息.:
可以被认为是一个带有元素和列表的函数,并返回一个列表,其第一个元素是第一个参数,其余部分是第二个参数,或者:
(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
你写道myLast :: [a] -> a
,找到你的功能; 但是,类型myLast (_:x) = x
是myLast :: [a] -> [a]
因为:
(你命名x
)的第二个参数本身就是一个列表.
另外,一般来说,当你不了解Haskell中的某些东西时,你应该首先看看它:t
在GHCI中使用的类型.
归档时间: |
|
查看次数: |
11145 次 |
最近记录: |