Search code examples
f#printfcurryingparamarray

In F#, how do you curry ParamArray functions (like sprintf)?


In F#, how do you curry a function that accepts a variable number of parameters?

I have code like this...(the log function is just an example, the exact implementation doesn't matter)

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

log "Sample"

It gets called throughout the code with sprintf formatted strings, ex.

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

I want to curry the sprintf functionality in the log function so it looks like...

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

I've tried something like

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

but I cannot figure out how to pass the ParamArray argument through to the sprintf call.

How is this done in F#?


Solution

  • let log (s : string) = ()
    let logger fmt = Printf.kprintf log fmt
    
    logger "%d %s" 10 "123"
    logger "%d %s %b" 10 "123" true