假设我有一个要修改的字符串:
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"]
我想替换
colors
中str
中的颜色。这是我到目前为止的内容:首先,一个用“ 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引擎的实现,因此,如果性能很重要,则需要进行测试第一。