2017-04-09 7 views
1

Ich versuche eine Funktion in Haskell zu schreiben, die eine Liste von ganzen Zahlen aufnehmen wird und wenn m ein Element dieser Liste ist, wird die Liste ohne m gedruckt, andernfalls wird nur die Liste gedruckt. Ich habe geschriebenLösche Integer aus Liste

rmvFirst :: Int -> [Int] -> [Int] 
rmvFirst m []       = error "Empty"      
rmvFirst m [x]  | x == m  = error "Empty Set" 
rmvFirst m (x:xs) | x == m  = (xs) 
rmvFirst m (x:xs) | otherwise  = rmvFirst m (xs) 

Wenn ich 3 [1..5] eingeben, gibt es [4..5] aus. Aber ich möchte {1,2,4,5}. Das Buch, das ich nur benutze hat min und max definiert.

+0

In welcher Sprache? –

+1

Warum ist eine leere Eingabe oder ein leeres Ergebnis ein Fehler? Das ist ziemlich überraschend! Was willst du auch machen, wenn mehrere Kopien von 'm' in der Liste sind? – dfeuer

+0

@dfeuer einen Fehler auf leere Eingabe Having könnte in manchen Kontexten sinnvoll sein. Das heißt, Sie möchten sicher sein, dass Ihre Funktion wirklich ein Element entfernt - wenn dies nicht der Fall ist, gibt es irgendwo anders einen Fehler, also möchten wir das jetzt vielleicht melden. Auf der anderen Seite ist der Fehler bei der leeren Ausgabe _really_ komisch, ich kann keine Rechtfertigung für diese Wahl finden. – chi

Antwort

2

Wie @hugomg kommentierte Ihr letzter Fall ist falsch.

rmvFirst :: Int -> [Int] -> [Int] 
rmvFirst m []       = error "Empty" 
rmvFirst m [x]  | x == m  = error "Empty Set" 
rmvFirst m (x:xs) | x == m  = (xs) 
rmvFirst m (x:xs) | otherwise  = x : rmvFirst m (xs) 
3

Der Fehler ist im letzten Fall. Sie müssen sicherstellen, dass die x in der Vorderseite der Liste, die nicht gleich m ist, ein Teil der Liste, die Sie zurückkommen.

+0

Ich verstehe, dass das Problem ist. Wie lautet die Syntax dafür? –

Verwandte Themen