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

List of Tuples (key, val), replace all instances in a string where key exists with val

我知道我可以很容易地以命令式的方式做到这一点。我想弄清楚的是如何以功能方式执行此操作。我觉得我应该能够用 fold 或 map 来完成这个,但我就是做不到。我已经有很长时间没有接受过函数式编程的教育了。

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

[|("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")。然后折叠遍历所有替换,并且对于每个替换,我们 return 一个新字符串。为此,我们将 orig 值替换为新值 repl,这是由 str.Replace(orig, string repl).

完成的

让这变得棘手的一件事是我们需要 str 的类型注释才能调用 Replace(如果没有这个,F# 将不知道 str 是一个字符串) .