元组列表(key, val),将字符串中key存在的所有实例替换为val



我知道我可以很容易地以命令式的方式做到这一点。我想弄清楚的是如何用函数的方式来做这个。我觉得我应该可以用折叠或映射来完成这个,但我就是想不出来。我已经很久没有接受函数式编程的教育了。

假设我有这样的元组(任意长度):

[|("X", 2);("Y", 3)|]

和像

这样的字符串
"X + Y"

我想要的结果是:

"2 + 3"

提前感谢。

正如您正确猜测的那样,您可以使用fold:

完成此操作。
[|("X", 2);("Y", 3)|]
|> Seq.fold (fun (str:string) (orig, repl) -> 
     str.Replace(orig, string repl)) "X + Y"

这个想法是我们使用字符串作为状态(初始状态是"X + Y")。然后,fold遍历所有替换项,对于每个替换项,我们返回一个新字符串。要做到这一点,我们将orig的值替换为repl的新值,这是由str.Replace(orig, string repl)完成的。

让这个问题变得棘手的是,为了调用Replace,我们需要str的类型注释(没有这个,f#将不知道str是一个字符串)。

最新更新