2009-11-18 7 views
7

Ich habe ein Problem mit einer Funktion, die nur den Schwanz einer Liste zurückgeben sollte. Die Funktionen sind myTail und sollten ein brauchbares Ergebnis liefern, auch wenn die Eingabe eine leere Liste ist.Haskell Tail-Funktion für leere Listen

Ich möchte alle 3 Möglichkeiten verstehen: Pattern-Matching, bewachte Gleichung und bedingte Ausdrücke

dies funktioniert:

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

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

Aber dieses:

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

gibt mir den Fehler: Programm error: pattern match failure: myTail_guard [] Wie kann ich die Funktion ohne Muster deklarieren?

Vielen Dank.

+0

könnte Ihnen helfen: http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html# Guards – Artelius

+2

Sie können einfach tun 'myTail = 1 fallen lassen ' – newacct

+1

Die Muster passende Version ist sowieso mehr Haskell-Like. – Rayne

Antwort

15

Das Muster x:xs stimmt nicht mit der leeren Liste überein. Sie müssen tun würden:

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

Wenn Sie 'tail xs' vermeiden möchten, ich denke, Sie könnten es ersetzen mit' xss wo (_, xss) = xs' – Artelius

+3

@Artelius: das sollte sein 'Xss wo (_ : xss) = xs'. – porges

+0

oder faule Muster – PyRulez

2

drop 1 sicher ist

drop 1 [] 
-- result: [] 
Verwandte Themen