在F#中链接string.replace

Jam*_*xon 6 f#

我有一个包含一些令牌的字符串,如下所示:

"There are two things to be replaced.  {Thing1} and {Thing2}"
Run Code Online (Sandbox Code Playgroud)

我想用不同的值替换每个标记,因此最终结果如下所示:

"There are two things to be replaced.  Don and Jon"
Run Code Online (Sandbox Code Playgroud)

我创建了一个链接String.Replace的函数

let doReplacement (message:string) (thing1:string) (thing2:string) =
    message.Replace("{Thing1}", thing1).Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)

问题是当我链接.Replace时,值必须保持在同一行.这样做不起作用:

let doReplacement (message:string) (thing1:string) (thing2:string) =
    message
    .Replace("{Thing1}", thing1)
    .Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)

为了让我做一个多线链,我想到这样的事情:

message
|> replaceString "{Thing1}" thing1
|> replaceString "{Thing2}" thing2
Run Code Online (Sandbox Code Playgroud)

有这样的支持功能:

let replaceString (message:string) (oldValue:string) (newValue:string) =
    message.Replace(oldValue, newValue)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.有没有其他方法来处理这个问题?

The*_*Fox 7

如果你缩进方法调用它会编译:

let doReplacement (message:string) (thing1:string) (thing2:string) =
    message
        .Replace("{Thing1}", thing1)
        .Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)

这是我在C#中经常看到的一种风格,对我来说似乎很合乎逻辑.


小智 6

通过使用|>管道值发送到最右边的未绑定参数(通过管道|>传送给thing2的值).通过反转参数的顺序,它按预期工作.

let replaceString (oldValue:string) (newValue:string) (message:string) =
    message.Replace(oldValue, newValue)

let message = "There are two things to be replaced.  {Thing1} and {Thing2}"
let thing1 = "Don"
let thing2 = "Jon"

message
|> replaceString "{Thing1}" thing1
|> replaceString "{Thing2}" thing2
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)

  • 我通常这样做,虽然我把函数放在`String`模块下的公共库中,所以它只是`String.replace`.该库在[NuGet](https://www.nuget.org/packages/CurryOn.Common/0.1.2)和[GitHub](https://github.com/CurryOnCoders/CurryOn/)上以CurryOn.Common的形式提供.树/主/ CurryOn.Common). (2认同)