假设我有一个要修改的字符串:

str = "I have several paints. For example, red, green, and blue."


我想把它变成:I have several paints. For example, XXX, XXX, and blue.

所以我有一个用XXX替换的单词列表:

colors = ["red", "green"]


我想替换colorsstr中的颜色。这是我到目前为止的内容:


首先,一个用“ xxx”代替某些东西的函数:subColor pat str = subRegex (mkRegex pat) str "xxx"
接下来,我尝试将其映射或将其折叠在颜色列表上。但我被困住了:map仅返回字符串的副本,每个副本都替换为一个单词,而foldl却出现了错误。我究竟做错了什么?


编辑:我还应该说我有时会使用多行单词,因此使用words(在另一个类似问题的答案中建议)对我而言并不实际。

Edit2:我应该添加一个大的正则表达式模式,例如blue|red可能也不适合我,因为实际上我要替换成千上万个这样的东西。

最佳答案

您想要的不是在多个map上的pat并获得新的str的列表,而是对每个subColor pat应用pat并将这些功能组合起来并将其应用到str

subColors :: [String] -> String -> String
subColors pats str = foldMap (Endo . subColor) pats str


在上面的代码中,foldMap使用instance Monoid (Endo a),与foldr (.) id相同。

而且,我仍然建议您尝试“一个大的regex模式”解决方案,因为regex引擎应该比您做更多的优化,但这取决于regex引擎的实现,因此,如果性能很重要,则需要进行测试第一。

10-06 04:24