我想给一个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
功能可以是什么样的?
答案 0 :(得分:23)
你想要
let tuple = ("Hello", "world")
printfn "%s %s" <|| tuple
注意||
中的<||
加|
而<|
let tuple = ("Hello", "world")
tuple
||> printfn "%s %s"
请参阅:MSDN <||
您也可以
|>
还有其他类似的operators,例如||>
,|||>
,<|
,<||
,<|||
和fst
。
使用snd
和let 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}}