2009-11-18 19 views
7

Ho un problema con una funzione che dovrebbe solo restituire la coda di una lista. Le funzioni sono myTail e dovrebbero dare un risultato utilizzabile, anche se l'input è una lista vuota.Funzione coda haskell per liste vuote

voglio capire tutti i 3 modi: pattern matching, equazione custodito e le espressioni condizionali

funziona:

> myTail_pat :: [a] -> [a] 

> myTail_pat (x:xs) = xs 
> myTail_pat [] = [] 

ma questo:

> myTail_guard (x:xs) | null xs = [] 
>    | otherwise = xs 

mi dà l'errore: Programma error: pattern match failure: myTail_guard [] Come posso dichiarare la funzione senza pattern?

Grazie.

+0

potrebbero aiutarvi: http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html# Guardie – Artelius

+2

si può solo fare 'myTail = drop 1' – newacct

+1

La versione di corrispondenza del modello è comunque più simile a haskell. – Rayne

risposta

15

Il modello x:xs non corrisponde all'elenco vuoto. Avresti bisogno di fare:

myTail_guard xs 
    | null xs = [] 
    | otherwise = tail xs 
+0

Se vuoi evitare 'tail xs' penso che potresti sostituirlo con' xss where (_, xss) = xs' – Artelius

+3

@Artelius: che dovrebbe essere 'xss dove (_ : xss) = xs'. – porges

+0

o modelli pigri – PyRulez

2

goccia 1 è sicuro

drop 1 [] 
-- result: [] 
Problemi correlati