2016-03-03 5 views
0

Я новичок в Haskell, и я пытаюсь написать функцию, которая сжимает строку символов + число последовательных появлений этого символа, такие как: aaaabccc -> a4bc3Haskell - Строка сжатия

до сих пор я есть что-то вроде:

comp :: String -> Int -> String 
comp [] n =[] 

comp (x:x1:xs) ct = if(x==x1) then comp (x1:ct:xs) (ct+1) else if(ct>0) then comp (x1:xs) (0) else comp (x1:xs) (0) 
comp (x:xs) n = x:xs 



main = do 
     a <- getLine 
     putStrLn $ comp a 0 

но я получаю следующую ошибку

main.cpp:4:45: 
    Couldn't match expected type `Char' with actual type `Int' 
    In the first argument of `(:)', namely `ct' 
    In the second argument of `(:)', namely `ct : xs' 
    In the first argument of `comp', namely `(x1 : ct : xs)' 
+0

Вы знаете, что ваш последний 'if' абсолютно излишними правильно? –

+0

Вы не можете делать 'x1: ct: xs',' ct' имеет тип 'Int', а' x1' - 'Char', а' xs' - '[Char]'. Вы хотите сделать «x1: показать ct ++ xs» или что-то подобное. – Bakuriu

+0

Кстати. Вы можете просто использовать 'Data.List.group' и написать что-то вроде' comp xs = concatMap (\ ys -> head ys: show (length ys)) $ group xs' (не тестировалось) – Bakuriu

ответ

4

Вы пытаетесь добавить в Int к String; вам необходимо явно преобразовать его в String; изменить:

comp (x1:ct:xs) 

в

comp (x1 : show ct ++ xs) 
+0

Спасибо, вот что мне нужно. –

Смежные вопросы