将元组添加到printfn等函数中

Rus*_*tam 12 f# tuples operators

我想给一个printf函数一个元组:

let tuple = ("Hello", "world")
do printfn "%s %s" tuple
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,编译器首先说,它需要string而不是string*string.我写的如下:

let tuple = ("Hello", "world")
do printfn "%s %s" <| fst tuple
Run Code Online (Sandbox Code Playgroud)

然后编译器合理地注意到现在我有类型的函数值string -> unit.说得通.我可以写

let tuple = ("Hello", "world")
do printfn "%s %s" <| fst tuple <| snd tuple
Run Code Online (Sandbox Code Playgroud)

它对我有用.但我想知道,如果有任何方法可以做得更好,就像

let tuple = ("Hello", "world")
do printfn "%s %s" <| magic tuple
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法获得printf需要哪种类型以便打印两个参数.什么magic功能看起来像?

Guy*_*der 24

你要

let tuple = ("Hello", "world")   
printfn "%s %s" <|| tuple
Run Code Online (Sandbox Code Playgroud)

请注意双重||输入<||而不是单个|输入<|

请参阅:MSDN<||

你也可以

let tuple = ("Hello", "world")
tuple
||> printfn "%s %s"
Run Code Online (Sandbox Code Playgroud)

还有其他类似的运营商,如|>,||>,|||>,<|,<||,和<|||.

一个惯用的方式做到这一点使用fstsnd

let tuple = ("Hello", "world")
printfn "%s %s" (fst tuple) (snd tuple)
Run Code Online (Sandbox Code Playgroud)

您通常不会看到使用||>或<||之一传递给函数的元组的原因 运营商是因为所谓的解构.

破坏表达式采用复合类型并将其破坏为部分.

因此,tuple ("Hello", "world")我们可以创建一个析构函数,将元组分成两部分.

let (a,b) = tuple
Run Code Online (Sandbox Code Playgroud)

我知道对于刚接触F#的人来说,这可能看起来像一个元组构造函数,或者看起来甚至更奇怪,因为我们有两个值被绑定,(注意我说绑定并没有分配),但它需要带有两个值的元组并对其进行解构分成两个独立的值.

所以我们在这里使用解构表达式.

let tuple = ("Hello", "world")
let (a,b) = tuple
printfn "%s %s" a b
Run Code Online (Sandbox Code Playgroud)

或更常见的

let (a,b) = ("Hello", "world")
printfn "%s %s" a b
Run Code Online (Sandbox Code Playgroud)

  • @Rustam我建议不要使用`magic`,因为它不是一种标准的做事方式.@GuyCoder列出了一些更为惯用的方法来完成你想要做的事情. (3认同)