Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Функциональные языки: общие вопросы > [Haskell] Операции над строками (тип данных)


Автор: Dimys1 18.4.2014, 08:03
Определим следующий набор операций над строками:
  • Очистка: удаление всех символов из строки
  • Удаление: удаление всех вхождений указанного символа
  • Замена: замена всех вхождений одного символа на другой
  • Добавление: добавление в начало строки указанного символа

Разработайте тип данных, характеризующий операции над строками. Определите следующие функции:
1) process, получающая в качестве аргумента действие и строку и возвращающая строку, модифицированную в соответствие с указанным действием.
2) processAll, аналогичная предыдущей, но получающая список действий и выполняющая их по порядку.
3) deleteAll, принимающая две строки и удаляющей из второй строки все символы первой. При реализации обязательно использовать функцию processAll.

Автор: Gluttton 19.4.2014, 20:28
Код:
Код

-- ======================================================= --
-- Definition of set of operations with strings.
-- ======================================================= --
-- ------------------------------------------------------- --
-- Cleaning string.
cleaning :: String -> String
cleaning _ = []
-- ------------------------------------------------------- --


-- ------------------------------------------------------- --
-- Removing all symbols 'c' from string.
removing :: Char -> String -> String
removing _ [] = []
removing c (x:xs)
    | x == c = removing c xs
    | otherwise = x:removing c xs
-- ------------------------------------------------------- --


-- ------------------------------------------------------- --
-- Replacing all symbols 'cs' to symbol 'cd' in string.
replacing :: Char -> Char -> String -> String
replacing _  _ [] = []
replacing cs cd (x:xs)
    | x == cs = cd : replacing cs cd xs
    | otherwise = x : replacing cs cd xs
-- ------------------------------------------------------- --


-- ------------------------------------------------------- --
-- Append symbol 'c' to start of string.
adding :: Char -> String -> String
adding c s = c : s
-- ------------------------------------------------------- --


-- ======================================================= --
-- Declaration of type which describe string modification.
-- ======================================================= --
-- ------------------------------------------------------- --
-- Type of function which modify string.
type StringModifier = String -> String
-- ------------------------------------------------------- --


-- ======================================================= --
-- Definition of string modificators.
-- ======================================================= --
-- ------------------------------------------------------- --
-- Modification of string 's' by modifier.
process :: StringModifier -> String -> String
process func s = func (s)
-- ------------------------------------------------------- --


-- ------------------------------------------------------- --
-- Modificaton of string 's' by list of modifiers.
processAll :: [StringModifier] -> String -> String
processAll [] s = s
processAll (f:fs) s = processAll fs (f (s) )
-- ------------------------------------------------------- --


-- ------------------------------------------------------- --
-- Removing from string 'b' all symbols from string 'a'.
deleteAll :: String -> String -> String
deleteAll [] b = b
deleteAll a [] = []
deleteAll a b  = processAll removingList b
    where removingList = foldl (\acc m -> (removing (m) ):acc) [] a
-- ------------------------------------------------------- --



-- ======================================================= --
-- Main function.
-- ======================================================= --
-- ------------------------------------------------------- --
main = do {
    putStrLn (                  inputString);
    putStrLn (cleaning          inputString);
    putStrLn (removing  'S'     inputString);
    putStrLn (replacing 'S' 'X' inputString);
    putStrLn (adding    'A'     inputString);
    putStrLn (process cleaning  inputString);
    putStrLn (processAll [
                    removing 's',
                    removing 'S',
                    removing 'r',
                    replacing '_' ' ',
                    removing ' '
                    ]           inputString);
    putStrLn (deleteAll "aoei"  "boenairoes");
}   where inputString = "Input stRiNgg__ _ witH STrrange Sym123ol345..!"
-- ------------------------------------------------------- --


Вывод программы:
Цитата

Input stRiNgg__ _ witH STrrange Sym123ol345..!

Input stRiNgg__ _ witH Trrange ym123ol345..!
Input stRiNgg__ _ witH XTrrange Xym123ol345..!
AInput stRiNgg__ _ witH STrrange Sym123ol345..!

InputtRiNggwitHTangeym123ol345..!
bnrs


Не уверен, что правильно, поэтом повнимательнее пожалуйста...

Автор: Compositum 11.12.2014, 09:53
Dimys1, задавая вопрос, выкладывай в т.ч. и свой вариант попытки решения с обозначением конкретных проблем, с которыми ты столкнулся в ходе написания кода. В противном случае это выглядит как "а напишите ка мне такое...". Обозначенные в теме вопросы демонстрируют нулевое знание Haskell, а отсутствие своего варианта решения - нежелание этим заниматься.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)