2016-02-13 13 views
10

私はちょうどHaskellの学習を始めました。パターンマッチングを使って、正確に2つの要素を持つリストに一致させようとしています。練習として、リストから1つだけ最後の要素を返す関数を記述しようとしています。これまでのところ、私はこれを見つけた: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つの要素を持つリストを一致させる方法がわかりません私はそこでやろうとしています。

+6

'[x、y]'または 'x:y:[]'と書くことができます。どちらも同等です。パターン '[x:y]'は、正確に一つの要素を含むリストとマッチすることを意味します。それはリストであり、 'x'と' y'という名前の2つの要素があります。 – 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です...私は、この(http://learnyouahaskell.com/syntax-in-functions#pattern-matching)のページを読んで、それは私をたくさん助けたが、私はまだ完全に存在していませんよ。

関連する問題