Как заменить строку на другую в haskell

Я хочу заменить строку из входного файла другой строкой. Я искал метод, но, похоже, я могу только изменить символ строки по символу. Например, в моем коде ниже

replace :: String -> String 
replace [] = [] 
replace (x:xs) = if x == '@' then 'y':replace xs --y is just a random char
                             else x:replace xs

searching :: String -> IO String
searching filename = do
    text <- readFile filename
    return(replace text)


main :: IO ()
main = do

  n <- searching "test.sf"
  writeFile "writefile.html" n 

Я хочу найти первое вхождение строки "@title", но я не могу найти способ сделать это, как упоминалось ранее, я могу получить доступ только к char '@'. Есть ли способ для выполнения такой задачи.

Ответы

Ответ 1

Вы можете использовать Data.List.Utils заменить, он ленив, и вы можете обрабатывать большой файл с некоторыми типами:

main = getContents >>= putStr . replace "sourceString" "destinationString"

Что все!

Возможная функция замены может быть

rep a b [email protected](x:xs) = if isPrefixOf a s

                     -- then, write 'b' and replace jumping 'a' substring
                     then b++rep a b (drop (length a) s)

                     -- then, write 'x' char and try to replace tail string
                     else x:rep a b xs

rep _ _ [] = []

другой умный способ (из Data.String.Utils)

replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace old new l = join new . split old $ l