2016-02-13 8 views
10

Ho appena iniziato ad imparare Haskell e sto cercando di utilizzare la corrispondenza del modello per abbinare una lista che ha esattamente 2 elementi. Come esercizio, sto provando a scrivere una funzione che restituisce l'ultimo elemento da una lista. Finora ho trovato questo:Elenco di corrispondenze con esattamente 2 elementi 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 

Ora la linea con myButLast [x: y] è chiaramente errato, ma non so come abbinare una lista che ha esattamente 2 elementi, come è quello che ho' sto cercando di fare lì. Ho letto questo (http://learnyouahaskell.com/syntax-in-functions#pattern-matching) pagina e mi ha aiutato molto, ma non sono del tutto ancora arrivati ​​...

+6

Si può scrivere '[x, y]' o 'x: y: []'. Sono entrambi equivalenti. Il modello '[x: y]' significa "abbina una lista che contiene esattamente un elemento, che è esso stesso una lista, che contiene esattamente due elementi chiamati' x' e 'y'", che non è quello che intendevi. – MathematicalOrchid

+0

@MathematicalOrchid Oh, capisco. Grazie mille! –

+8

In realtà, no, è sbagliato ... '[x: y]' significa che 'x' è il primo elemento e' y' è la sottolista rimanente. (Pensa '[x: xs]'.) Scusa per quello ... In ogni caso, non è quello che intendevi. – MathematicalOrchid

risposta

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

Questa è la seconda quesion in 99 questions.

Problemi correlati