Удаление символов, соответствующих шаблону

Haskell:
Удаление символов, соответствующих шаблону

Как это сделать:

import Data.List (isInfixOf)
import Data.Char (isSpace)

-- Простая функция удаления шаблона из строки
removePattern :: Eq a => [a] -> [a] -> [a]
removePattern [] _ = []
removePattern string@(x:xs) pattern
  | pattern `isInfixOf` string = removePattern (drop (length pattern) string) pattern
  | otherwise = x : removePattern xs pattern

-- Использование предопределенных функций для обрезания пробелов в строке
trim :: String -> String
trim = f . f
   where f = reverse . dropWhile isSpace

main :: IO ()
main = do
  let text = "Haskell очень крут, действительно очень крут."
  let cleanedText = removePattern text "очень "
  putStrLn cleanedText  -- "Haskell крут, крут действительно."
  putStrLn $ trim "   Убраны начальные и конечные пробелы   " -- "Убраны начальные и конечные пробелы"

Глубокое Погружение

Богатый набор библиотек Haskell, таких как ‘Data.List’, предоставляет разнообразные инструменты для манипулирования списками, которые, по сути, являются специальным случаем строк. Исторически, сопоставление с образцом в Haskell заимствовано из старых функциональных языков, например, ML.

В Haskell существуют различные способы сопоставления с образцом. Наша простая функция removePattern использует isInfixOf для проверки наличия шаблона. Также существуют библиотеки для работы с регулярными выражениями для сложных шаблонов, но они добавляют зависимости и иногда усложняют задачу.

Говоря о зависимостях, для обрезания пробелов можно было бы импортировать стороннюю библиотеку, но наша функция ’trim’ справляется с задачей нативно.

Наконец, с точки зрения производительности, всегда будьте осторожны с рекурсивными функциями в Haskell; они могут быть неэффективны, если компилятор не оптимизирует их должным образом. Могут накапливаться танки, вызывая утечки памяти. Для повышения производительности, возможно, стоит исследовать модуль Text Haskell для работы с большими или многочисленными строками.

См. Также