2013-12-13 15 views
9

tôi muốn cung cấp một tuple để một hàm printf:ăn tuple vào chức năng như printfn

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

này, tất nhiên, không hoạt động, trình biên dịch đầu tiên nói rằng nó cần string thay vì string*string. Tôi viết nó như sau:

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

Sau đó trình biên dịch ghi chú hợp lý bây giờ tôi có giá trị chức năng loại string -> unit. Có ý nghĩa. Tôi có thể viết

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

Và nó làm việc cho tôi. Nhưng tôi tự hỏi, nếu có thể có cách nào để làm điều đó đẹp hơn, chẳng hạn như

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

Vấn đề của tôi là tôi không thể nhận được loại in cần để in hai đối số. Chức năng magic có thể trông như thế nào?

Trả lời

19

Bạn muốn

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

Thông báo các đôi || trong <|| và không phải là một đơn | trong <|

Xem: MSDN <||

Bạn cũng có thể làm

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

Có các số khác tương tự operators chẳng hạn như |>, ||>, |||>, <|, <||<|||.

Một cách thành ngữ để làm điều đó bằng fstsnd

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

Lý do bạn không thường thấy một tuple truyền cho một chức năng với một trong những ||> hoặc < || các toán tử là vì cái được gọi là destructuring.

Biểu thức hủy có một loại kết hợp và phá hủy nó thành các phần.

Vì vậy, đối với tuple ("Hello", "world"), chúng tôi có thể tạo một trình phá hủy làm hỏng bộ túp thành hai phần.

let (a,b) = tuple 

Tôi biết điều này có thể trông giống như một nhà xây dựng tuple cho người mới đến F #, hoặc có thể trông thậm chí odder vì chúng tôi có hai giá trị bị ràng buộc vào, (chú ý tôi nói ràng buộc và không được giao), nhưng nó có tuple với hai giá trị và phá hủy nó thành hai giá trị riêng biệt.

Vì vậy, ở đây chúng tôi làm điều đó bằng cách sử dụng biểu thức phá hoại.

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

hoặc phổ biến hơn

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

Wow !!! Nhờ có bạn tôi đã nhận nó ngay bây giờ! My 'ma thuật' sẽ trông giống như – Rustam

+0

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

+0

và in sẽ giống như 'ma thuật (printfn"% s% s ") tuple' – Rustam

Các vấn đề liên quan