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

时间:2015-08-04 00:41:06

标签: f# f#-3.0

我知道我可以很轻松地以强制性的方式做到这一点。我想弄清楚的是如何以功能的方式做到这一点。我觉得我应该能够通过折叠或地图来实现这一目标,但我无法解决这个问题。自从我接受函数式编程教育以来,已经有很长一段时间了。

说我有像(任意长度)的元组:

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

像一个字符串:

"X + Y"

我想要一个结果:

"2 + 3"

提前致谢。

1 个答案:

答案 0 :(得分:3)

正如您所猜测的,您可以使用fold

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

我们的想法是我们使用字符串作为状态(初始状态是" X + Y")。然后折叠迭代所有替换,并且对于每次替换,我们返回一个新字符串。为此,我们将orig值替换为新值repl,该值由str.Replace(orig, string repl)完成。

使这一点变得棘手的一点是我们需要str的类型注释才能调用Replace(如果没有这个,F#就不会知道str是一个字符串)。< / p>