Haskell中正好有2个元素的模式匹配列表

Haskell中正好有2个元素的模式匹配列表,haskell,pattern-matching,Haskell,Pattern Matching,我刚刚开始学习Haskell,我正在尝试使用模式匹配来匹配正好有2个元素的列表。作为练习,我尝试编写一个函数,返回列表中最后一个元素。到目前为止,我发现: myButLast :: [a] -> a myButLast [] = error "Cannot take one but last from empty list!" myButLast [x] = error "Cannot take one but last from list with only one element!"

我刚刚开始学习Haskell,我正在尝试使用模式匹配来匹配正好有2个元素的列表。作为练习,我尝试编写一个函数,返回列表中最后一个元素。到目前为止,我发现:

myButLast :: [a] -> a
myButLast [] = error "Cannot take one but last from empty list!"
myButLast [x] = error "Cannot take one but last from list with only one element!"
myButLast [x:y] = x
myButLast (x:xs) = myButLast xs
现在,myButLast[x:y]的行显然是不正确的,但是我不知道如何匹配一个正好有2个元素的列表,因为这就是我在那里要做的。我读了这个()页面,它对我帮助很大,但我还没有完全做到这一点

myButLast :: [a] -> a
myButLast [] = error "empty list"
myButLast [x] = error "too few elements"
myButLast [x, _] = x
myButLast (x: xs) = myButLast xs

这是中的第二个问题。

您可以编写
[x,y]
x:y:[]
。它们都是等价的。模式
[x:y]
的意思是“匹配一个只包含一个元素的列表,它本身就是一个列表,只包含两个名为
x
y
”的元素”,这不是你的意思。@MathematicalOrchid哦,我明白了。非常感谢你!事实上,不,那是错误的
[x:y]
表示
x
是第一个元素,
y
是剩余的子列表。(想想看,
[x:xs]
)很抱歉。。。不管怎样,这都不是你的意思。而且,你的最后一条规则似乎与“正好2个元素”的要求相矛盾。我建议首先匹配您需要的内容(
[x,]
),然后将任何其他内容与catch-all模式(
)匹配,作为一个错误。