2012-06-21 22 views
6

Trong F #, làm thế nào để bạn curry một hàm chấp nhận một số biến của các tham số?Trong F #, làm thế nào để bạn curry chức năng ParamArray (như sprintf)?

tôi có mã như thế này ... (hàm log chỉ là một ví dụ, việc thực hiện chính xác không quan trọng)

let log (msg : string) = 
    printfn "%s" msg 

log "Sample" 

Nó được gọi trong suốt mã với sprintf định dạng chuỗi, ex.

log (sprintf "Test %s took %d seconds" "foo" 2.345) 

Tôi muốn để cà ri có các chức năng sprintf trong hàm log để nó trông giống như ...

logger "Test %s took %d seconds" "foo" 2.345 

Tôi đã thử một cái gì đó giống như

let logger fmt ([<ParamArray>] args) = 
    log (sprintf fmt args) 

nhưng tôi không thể tìm ra làm thế nào để vượt qua đối số ParamArray thông qua cuộc gọi chạy nước rút.

Điều này được thực hiện như thế nào trong F #?

+2

FYI - Bạn đang hỏi về [biểu thức định dạng] (http://msdn.microsoft.com/en-us/library/ee340241) (được đánh máy), không phải mảng tham số (không được nhập). – Daniel

Trả lời

7
let log (s : string) =() 
let logger fmt = Printf.kprintf log fmt 

logger "%d %s" 10 "123" 
logger "%d %s %b" 10 "123" true 
+0

Cảm ơn đây là những gì tôi đang tìm kiếm – Fendy

5

Hành vi của printf giống như chức năng trong F # là một cách đặc biệt. Họ lấy một chuỗi định dạng, trong đó xác định những gì các đối số dự kiến ​​là. Bạn có thể sử dụng Printf.kprintf như được hiển thị bởi desco để xác định hàm của riêng bạn có chuỗi định dạng, nhưng bạn không thể thay đổi việc xử lý chuỗi định dạng.

Nếu bạn muốn làm một cái gì đó như C# params (mà số lượng các đối số có thể thay đổi, nhưng không phụ thuộc vào chuỗi định dạng), sau đó bạn có thể sử dụng ParamArray thuộc tính trực tiếp trên thành viên:

open System 

type Foo = 
    static member Bar([<ParamArray>] arr:obj[]) = 
    arr |> Seq.mapi (fun i v -> printfn "[%d]: %A" i v) 

sau đó, bạn có thể gọi Foo.Bar với bất kỳ số lượng các đối số mà không cần chuỗi định dạng:

Foo.Bar("hello", 1, 3.14) 

Đây là ít thanh lịch để định dạng chuỗi, nhưng nó có thể có ích trong các tình huống khác. Unfortunatelly, nó sẽ chỉ làm việc với các thành viên (và không phải với các chức năng được xác định với let)

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