2016-02-13 132 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。