我正在寻找String (what to replace) -> String (what to replace it with) -> String (the string) -> String (the result)
类型的函数。它应该只替换最后一次出现。我会接受使用Text
代替String
的解决方案。我搜索了hoogle和stackage并没有找到功能。
答案 0 :(得分:1)
标准库中没有一个。虽然写起来并不难(但它并不是最有效的实现)。由于列表的结构,替换第一个列表实际上要方便得多。
import Data.List (stripPrefix)
replace :: (Eq a) => [a] -> [a] -> [a] -> [a]
replace needle newNeedle [] = []
replace needle newNeedle (h:haystack) =
case stripPrefix needle (h:haystack) of
Just haystack' -> newNeedle ++ haystack'
Nothing -> h : replace needle newNeedle haystack
然后拿到最后一个你可以做一些逆转体操。
replaceLast :: (Eq a) => [a] -> [a] -> [a] -> [a]
replaceLast needle newNeedle haystack
= reverse $ replace (reverse needle) (reverse newNeedle) (reverse haystack)