3

我想用 Haskell 中的字符串替换子字符串,而不使用外部库,并且如果可能的话,具有良好的性能。

我考虑过使用Data.Text替换功能,但我不想移植我的整个程序以使用Text类型而不是Strings. 是否会将其打包String成一个Text值,然后替换我想要的值,然后将该 Text 值解包为 aString会很慢Strings

4

2 回答 2

8

试试这个(未经测试):

replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace needle replacement haystack
  = case begins haystack needle of
      Just remains -> replacement ++ remains
      Nothing      -> case haystack of
                        []     -> []
                        x : xs -> x : replace needle replacement xs

begins :: Eq a => [a] -> [a] -> Maybe [a]
begins haystack []                = Just haystack
begins (x : xs) (y : ys) | x == y = begins xs ys
begins _        _                 = Nothing

但总的来说,您可以通过将程序切换为使用Texts 而不是Strings 来获得性能提升。

于 2013-02-14T17:44:33.417 回答
5

这是我的解决方案

import Data.List (intercalate)
import Data.List.Split (splitOn)

replace from to = intercalate to . splitOn from

例子

replace "squirrel" "platypus" "Daddy, I want a squirrel !"

爸爸,我想要一只鸭嘴兽!

于 2018-03-13T16:28:40.053 回答