Wyszukiwanie i zamiana tekstu

Haskell:
Wyszukiwanie i zamiana tekstu

How to:

import Data.List (isInfixOf, intercalate)

searchReplace :: String -> String -> String -> String
searchReplace searchStr replaceStr text = 
    intercalate replaceStr . splitOn searchStr $ text

splitOn :: Eq a => [a] -> [a] -> [[a]]
splitOn [] _ = error "Delimiter cannot be an empty list"
splitOn _ [] = [[]]
splitOn delim list
    | delim `isInfixOf` list = let (start, rest) = breakOn delim list
                               in start : splitOn delim (drop (length delim) rest)
    | otherwise = [list]

breakOn :: Eq a => [a] -> [a] -> ([a], [a])
breakOn _ [] = ([], [])
breakOn delim list@(x:xs)
   | delim `isPrefixOf` list = ([], drop (length delim) list)
   | otherwise = let (ys, zs) = breakOn delim xs in (x:ys, zs)

main = putStrLn $ searchReplace "world" "Haskell" "hello world!"

Output:

hello Haskell!

Deep Dive

Pod koniec lat 60. pojawiły się pierwsze narzędzia do przetwarzania tekstu, jak sed. W Haskellu można to robić elegancko, korzystając z funkcji wyższego rzędu i leniwego przetwarzania. Alternatywą jest regex, ale wzorce szukamyz Data.Text i Data.ByteString są często szybsze. Immutability w Haskellu oznacza, że każde “zamiany” to tak naprawdę tworzenie nowego ciągu znaków.

See Also