如何用另一个String替换最后一次出现的String?

时间:2017-08-23 01:03:15

标签: haskell

我正在寻找String (what to replace) -> String (what to replace it with) -> String (the string) -> String (the result)类型的函数。它应该只替换最后一次出现。我会接受使用Text代替String的解决方案。我搜索了hoogle和stackage并没有找到功能。

1 个答案:

答案 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)