元组列表(键,值),将字符串中存在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
是一个字符串) .
我知道我可以很容易地以命令式的方式做到这一点。我想弄清楚的是如何以功能方式执行此操作。我觉得我应该能够用 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
是一个字符串) .