2016-02-13 8 views
10

Ich habe gerade angefangen, Haskell zu lernen, und ich versuche Mustervergleiche zu verwenden, um eine Liste mit genau 2 Elementen zu finden. Als Übung versuche ich eine Funktion zu schreiben, die das eine aber letzte Element aus einer Liste zurückgibt. Bisher fand ich dies:Muster-Match-Liste mit genau 2 Elementen in Haskell

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 

Nun ist die Linie mit myButLast [x: y] ist eindeutig falsch, aber ich weiß nicht, wie eine Liste übereinstimmen, die genau 2 Elemente hat, wie das ist, was ich Ich versuche es dort zu tun. Ich lese diese (http://learnyouahaskell.com/syntax-in-functions#pattern-matching) Seite und es hat mir sehr geholfen, aber ich bin nicht ganz dort noch ...

+6

Sie können entweder '[x, y]' oder 'x: y: []' schreiben. Sie sind beide gleichwertig. Das Muster '[x: y]' bedeutet "finde eine Liste, die genau ein Element enthält, das selbst eine Liste ist, die genau zwei Elemente enthält, die' x' und 'y'" genannt werden, was nicht gemeint ist. – MathematicalOrchid

+0

@ MathematicalOrchid Oh, ich verstehe. Vielen Dank! –

+8

Eigentlich nein, das ist falsch ... '[x: y]' bedeutet 'x' ist das erste Element und' y' ist die verbleibende Unterliste. (Denk '[x: xs]'.) Sorry, dass ... Wie auch immer, es ist nicht das, was du meintest. – MathematicalOrchid

Antwort

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

Dies ist die zweite quesion in 99 questions.

Verwandte Themen