2013-02-16 3 views
16

Я хочу заменить строку из входного файла другой строкой. Я искал метод, но, похоже, я могу только изменить символ строки по символу. Например, в моем коде нижеКак заменить строку на другую в 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», но я не могу показаться, чтобы найти способ сделать это, как упоминалось ранее, я могу получить доступ только полукокс '@'. Есть ли способ для выполнения такой задачи.

+2

возможно дубликат [Как я могу заменить подстроку строки с другим в Haskell без использования внешних библиотек, таких как MissingH?] (Http://stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without- используя) –

+1

Думаю, это уже обсуждалось здесь: http://stackoverflow.com/questions/14 880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without-using – kaan

+1

Это не дубликат. Другой вопрос конкретно исключает использование других библиотек, что является разумным ответом на этот вопрос. –

ответ

20

Вы можете использовать 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 
+11

Альтернативно, используя [Data.List.Split] (http://hackage.haskell.org/packages/archive/split/0.2.1.1/doc/html/Data-List-Split.html) из пакета 'split' который является частью платформы Haskell, определите «replace old new = intercalate new». splitOn old'. –