将元组添加到printfn等函数中

时间:2013-12-13 13:58:12

标签: f# operators tuples

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

let tuple = ("Hello", "world")
do printfn "%s %s" tuple

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

let tuple = ("Hello", "world")
do printfn "%s %s" <| fst tuple

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

let tuple = ("Hello", "world")
do printfn "%s %s" <| fst tuple <| snd tuple

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

let tuple = ("Hello", "world")
do printfn "%s %s" <| magic tuple

我的问题是我无法获得printf需要哪种类型以便打印两个参数。 magic功能可以是什么样的?

1 个答案:

答案 0 :(得分:23)

你想要

let tuple = ("Hello", "world")   
printfn "%s %s" <|| tuple

注意||中的<|||<|

中只有let tuple = ("Hello", "world") tuple ||> printfn "%s %s"

请参阅:MSDN <||

您也可以

|>

还有其他类似的operators,例如||>|||><|<||<|||fst

使用sndlet tuple = ("Hello", "world") printfn "%s %s" (fst tuple) (snd tuple) 执行此操作的惯用方法是

tuple ("Hello", "world")

你通常不会看到一个元组传递给一个带有||&gt;之一的函数的原因或&lt; ||运营商是因为所谓的解构

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

因此,对于let (a,b) = tuple ,我们可以创建一个析构函数,将元组分成两部分。

let tuple = ("Hello", "world")
let (a,b) = tuple
printfn "%s %s" a b

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

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

let (a,b) = ("Hello", "world")
printfn "%s %s" a b

或更常见

{{1}}