Я попытался написать программу в Haskell, которая возьмет строку целых чисел, разделенных запятой, преобразует ее в список целых чисел и увеличивает каждое число на 1.
Например
"1,2,-5,-23,15" -> [2,3,-4,-22,16]
Ниже приведена программа
import Data.List
main :: IO ()
main = do
n <- return 1
putStrLn . show . map (+1) . map toInt . splitByDelimiter delimiter
$ getList n
getList :: Int -> String
getList n = foldr (++) [] . intersperse [delimiter] $ replicate n inputStr
delimiter = ','
inputStr = "1,2,-5,-23,15"
splitByDelimiter :: Char -> String -> [String]
splitByDelimiter _ "" = []
splitByDelimiter delimiter list =
map (takeWhile (/= delimiter) . tail)
(filter (isPrefixOf [delimiter])
(tails
(delimiter : list)))
toInt :: String -> Int
toInt = read
Самая сложная часть для меня заключалась в программировании функции splitByDelimiter
, которая берет строку и возвращает список строк
"1,2,-5,-23,15" -> ["1","2","-5","-23","15"]
Думал, что это работает, я не доволен тем, как это написано. Есть много круглых скобок, поэтому выглядит как Lisp. Также алгоритм несколько искусственен:
-
Подготовить разделитель к началу строки
",1,2,-5,-23,15"
-
Создать список всех хвостов
[",1,2,-5,-23,15", "1,2,-5,-23,15", ",2,-5,-23,15", .... ]
-
Фильтровать и оставить только строки, начинающиеся с разделителя
[",1,2,-5,-23,15", ",2,-5,-23,15", .... ]
-
Отбросьте первый разделитель и возьмите символы, пока не будет выполнен следующий разделитель
["1", "2", .... ]
Итак, вопросы:
Как я могу улучшить функцию splitByDelimiter
?
Можно ли удалить префикс и падение разделителя и сделать прямое разделение строки?
Как я могу переписать функцию, чтобы было меньше скобок?
Может быть, я что-то пропустил, и с этой функциональностью уже есть стандартная функция?