2013-12-13 35 views
9

voglio dare una tupla a una funzione printf:alimentazione tupla in funzione come printfn

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

Questo, naturalmente, non funziona, compilatore prima dice che ha bisogno invece di stringstring*string. Io lo scrivo come segue:

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

Poi compilatore ragionevolmente nota che ora ho valore di funzione di tipo string -> unit. Ha senso. Posso scrivere

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

E funziona per me. Ma mi chiedo, se ci potrebbe essere un modo per farlo più bello, come

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

mio problema è che non riesco a quale tipo non printf necessità in modo da stampare due argomenti. Che aspetto potrebbe avere la funzione magic?

risposta

19

Volete

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

Avviso il doppio || in <|| e non una sola | in <|

See: MSDN <||

È anche possibile fare

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

Esistono altri simili operators come |>, ||>, |||>, <|, <|| e <|||.

Un modo idiomatico di farlo utilizzando fst e snd è

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

Il motivo non si solito si vede una tupla passato a una funzione con una delle ||> o < || gli operatori è a causa di ciò che è noto come destrutturazione.

Un'espressione destrutturante prende un tipo composto e lo distrugge in parti.

Quindi per il tuple ("Hello", "world") possiamo creare un distruttore che spezza la tupla in due parti.

let (a,b) = tuple 

So che questo può sembrare un costruttore tuple a qualcuno di nuovo da F #, o può sembrare ancora più strano perché abbiamo due valori vincolati a, (notato ho detto legato e non assegnato), ma ci vuole la tupla con due valori e destrutturata in due valori separati.

Quindi qui lo facciamo usando un'espressione destrutturante.

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

o più comunemente

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

Wow !!! Grazie a te l'ho capito ora! Il mio 'magico' dovrebbe apparire come – Rustam

+0

' let magic op tuple = op <| prima tupla <| snd tuple' – Rustam

+0

e la stampa sarebbe come 'magic (printfn"% s% s ") tuple' – Rustam

Problemi correlati