2009-11-18 31 views
7

Tengo un problema con una función que solo debe devolver el final de una lista. Las funciones son myTail y deberían dar un resultado utilizable, incluso si la entrada es una lista vacía.Función de cola Haskell para listas vacías

Quiero entender los 3 maneras: la coincidencia de patrones, la ecuación vigilado y expresiones condicionales

funciona esto:

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

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

que esto:

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

me da el error: Programa error: error de coincidencia de patrón: myTail_guard [] ¿Cómo puedo declarar la función sin patrones?

Gracias.

+0

pueden ayudar: http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html# Guardias – Artelius

+2

puedes hacer 'myTail = drop 1' – newacct

+1

La versión de coincidencia de patrones es más parecida a haskell de todos modos. – Rayne

Respuesta

15

El patrón x:xs no coincide con la lista vacía. Que había necesidad de hacer:

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

Si quieres evitar 'tail xs' creo que podrías reemplazarlo por' xss donde (_, xss) = xs' – Artelius

+3

@Artelius: debería ser 'xss where (_ : xss) = xs'. – porges

+0

o patrones perezosos – PyRulez

2

gota 1 es segura

drop 1 [] 
-- result: [] 
Cuestiones relacionadas