2013-12-13 4 views
9

Ich möchte ein Tupel zu einer printf Funktion geben:Feeding Tupels in Funktion wie printfn

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

Dies ist natürlich nicht funktioniert, Compiler zuerst sagt, dass es string statt string*string muss. Ich schreibe es wie folgt:

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

Dann Compiler stellt fest, vernünftig, dass ich jetzt Funktionswert vom Typ string -> unit haben. Macht Sinn. Ich kann schreiben

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

Und es funktioniert für mich. Aber ich frage mich, ob es vielleicht eine Möglichkeit sein, es schöner zu tun, wie

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

Mein Problem ist, dass ich nicht bekommen kann, welche Art Notwendigkeit printf ist, so dass zwei Argumente zu drucken. Was könnte magic Funktion aussehen?

Antwort

19

Sie wollen

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

Beachten Sie den Doppel || in <|| und kein einziges | in <|

See: MSDN <||

Sie können tun, auch

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

Es gibt andere ähnliche operators wie |>, ||>, |||>, <|, <|| und .

Eine idiomatische Weg, um es mit fst und snd zu tun ist,

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

Der Grund, warum Sie in der Regel nicht ein Tupel auf eine Funktion mit einem der ||> oder < bestanden sehen || Betreiber ist wegen der so genannten Destrukturierung.

Ein zerstörender Ausdruck nimmt einen zusammengesetzten Typ und zerstört ihn in Teile.

Also für die tuple ("Hello", "world") können wir einen Destruktor erstellen, der das Tupel in zwei Teile zerlegt.

let (a,b) = tuple 

Ich weiß, das neue wie ein Tupel Konstruktor jemand aussehen zu F #, oder schauen sogar odder weil wir zwei Werte haben werden gebunden, (bemerkte ich der gebundenen und nicht belegt), aber es dauert die Tupel mit zwei Werten und destrukturiert es in zwei separate Werte.

Also hier machen wir es mit einem destrukturierenden Ausdruck.

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

oder häufiger

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

Wow !!! Dank dir habe ich es jetzt! Meine "Magie" sollte wie folgt aussehen: – Rustam

+0

'let magic op tuple = op <| fst Tupel <| Snd Tupel " – Rustam

+0

und Drucken wäre wie" Magie (printfn "% s% s") Tupel " – Rustam