2017-02-09 3 views
0

Ich versuche ein einfaches Problem auf HackerRank zu lösen und erhalte den Fehler im Titel. Ich bin ein Haskell-Noob, so nackt mit mir. Das Problem besteht darin, eine Zeichenfolge aufzunehmen und sie zu reduzieren, indem benachbarte Buchstabenpaare entfernt werden. Also "aabcdd" => "bc" zum Beispiel. Hier ist mein Code:Haskell-String-Manipulation. Nicht erschöpfende Muster im Funktionsfehler.

main :: IO() 
main = do 
    line <- getLine 
    putStrLn (reduce' line) 

reduce' :: String -> String 
reduce' [] = [] 
reduce' (x0:x1:xs) 
    | x1:xs == [] = [x0] 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

Ich bin verwirrt, weil ich denke, ich habe die Randfälle abgedeckt. Ich möchte keine Antwort auf das Problem, ich möchte nur wissen, warum ich den Fehler bekomme. Vielen Dank!

+0

Es ist eine Weile her, seit ich Haskell geschrieben habe, aber der letzte Fall wird nur genau 3 Zeichen entsprechen. Wenn die Zeichenfolge 1 oder 2 Elemente enthält, wird sie nicht übereinstimmen. – Carcigenicate

+0

@Carcigenicate: keine zwei Elemente 'xs' ist das Ende der Liste. –

+0

@ WillemVanOnsem Oh richtig. Also nur 1 Element. – Carcigenicate

Antwort

4

Sie sind nicht den Fall passend, wo man nur ein Element in der Liste

reduce' :: String -> String 
reduce' [] = [] 
reduce' [x] = [x] 
reduce' (x0:x1:xs) 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

Diese | x1:xs == [] = [x0] ist der Mustervergleich hinzugefügt hat, so gibt es keine Notwendigkeit, in den Wachen zu überprüfen.

+0

Das war es! Vielen Dank. – Outis

+1

Beachten Sie, dass die ersten beiden Fälle zusammen geschrieben werden können, wenn Sie x = x reduzieren, wenn Sie es nach dem x0: x1: xs-Fall eingeben. – chepner

Verwandte Themen