2017-02-09 3 views
0

Я пытаюсь решить простую проблему на HackerRank и получаю ошибку в названии. Я Haskell noob так голый со мной. Задача требует взять строку и уменьшить ее, удалив соседние пары букв. Например, «aabcdd» => «bc». Вот мой код:Haskell манипуляции строк. Неисчерпывающие шаблоны в функциональной ошибке.

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 

Я смущен, потому что думаю, что у меня есть кромки. Я не хочу отвечать на проблему, я просто хочу знать, почему я получаю ошибку. Благодаря!

+0

Прошло некоторое время с тех пор, как я написал Haskell, но iirc, ваш последний случай будет соответствовать ровно 3 символам. Если строка имеет 1 или 2 элемента, она не будет соответствовать. – Carcigenicate

+0

@Carcigenicate: нет двух элементов 'xs' - это хвост списка. –

+0

@WillemVanOnsem О, верно. Так что всего один элемент. – Carcigenicate

ответ

4

Вы не соответствующий случай, когда у вас есть только один элемент в списке

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

Это | x1:xs == [] = [x0] является шаблон согласования добавляется, поэтому нет необходимости проверять в охранников.

+0

Вот и все! Благодарю. – Outis

+1

Обратите внимание, что первые два случая вместе могут быть записаны как один из следующих: 'reduce 'x = x', если вы поместите его * после * случая' x0: x1: xs'. – chepner