Конкатенация к списку строк другой строки - PullRequest
0 голосов
/ 24 ноября 2018

Приведенный ниже код возвращает список строк, но я хочу, чтобы он работал в нескольких случаях.Проблема в том, что я не могу создать такой же точный результат с рекурсией.Программа возвращает следующий результат:

replaceTabs 6 ["\thello world"]

=> ["      hello world"]

Теперь это должно работать с более длинным списком, таким как:

replaceTabs 6 ["asd dsa","\thello world"]

    => ["asd dsa","      hello world"]

Простой конкат не работает, потому что он возвращает неопределенный образец.

replaceTab' :: Int -> [[Char]] -> [Char]
replaceTab' n [[x]] =
 if x == '\t' then replicate n ' '
 else [x]

replaceTabs :: Int -> [String]-> [String]
replaceTabs n [""] = [""]
replaceTabs n (x:xs) = (return . concat $ [replaceTab' n [a] | a <- (map (:[]) (x))])

1 Ответ

0 голосов
/ 24 ноября 2018

Этот

replaceTab' :: Int -> [[Char]] -> [Char]

такой же, как,

replaceTab' :: Int -> [String] -> String

. На чем вам следует сосредоточиться, так это на реализации функции,

replaceTab :: Int -> String -> String

, которая "исправляет"один String.Тогда replaceTabs это просто,

replaceTabs :: Int -> [String] -> [String]
replaceTabs n = map (replaceTab n) 
...