2016-02-13 137 views
10

我刚开始学习Haskell,我试图使用模式匹配来匹配具有2个元素的列表。作为一个练习,我试图编写一个函数,它返回列表中的最后一个元素。到目前为止,我发现这一点:与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个元素的列表,因为这是我米试图在那里做。我读这(http://learnyouahaskell.com/syntax-in-functions#pattern-matching)页面,它帮了我很多,但我不完全有尚未...

+6

你可以写'[x,y]'或'x:y:[]'。它们都是等同的。模式'[x:y]'意思是“匹配一个只包含一个元素的列表,它本身就是一个列表,它包含两个名为'x'和'y'的元素,这不是你的意思。 – MathematicalOrchid

+0

@MathematicalOrchid哦,我明白了。非常感谢你! –

+8

实际上,不,这是错的......'[x:y]'表示'x'是第一个元素,'y'是剩下的子列表。 (想''[x:xs]'。)对不起,这......不管怎样,这不是你的意思。 – MathematicalOrchid

回答

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

这是99 questions第二quesion。