2013-12-13 2 views
9

Я хочу дать кортеж к printf функции:Кормление кортеж в функции, такие как printfn

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?

ответ

19

Вы хотите

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

Обратите внимание на двойной || в <|| и не один | в <|

См: MSDN <||

Вы также можете сделать

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

Существуют и другие аналогичные operators, такие как |>, ||>, |||>, <|, <|| и <|||.

идиоматических способ сделать это с помощью fst и snd является

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

Причина вы обычно не видите кортеж, передаваемый функции с одним из ||> или < || операторы из-за того, что известно как деструктурирование .

Деструктивное выражение принимает составной тип и разрушает его на части.

Итак, для tuple ("Hello", "world") мы можем создать деструктор, который разбивает кортеж на две части.

let (a,b) = tuple 

Я знаю, что это может выглядеть как кортеж конструктора для кого-то нового на F #, или может выглядеть даже более странно, потому что мы имеем два значения быть привязаны к, (заметил, что я сказал, связанный и не назначен), но она принимает кортеж с двумя значениями и разрушил его на два отдельных значения.

Итак, мы делаем это, используя выражение для деструкции.

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

или чаще

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

Wow !!! Благодаря вам я получил его сейчас! Моя «магия» должна выглядеть так: – Rustam

+0

'let magic op tuple = op <| fst tuple <| snd tuple' – Rustam

+0

и печать будет выглядеть как 'magic (printfn"% s% s ") tuple' – Rustam

Смежные вопросы