在F#中,如何使用paramary函数(如sprintf)?
在F#中,如何处理接受可变数量参数的函数 我有这样的代码…(log函数只是一个示例,确切的实现并不重要) 它在整个代码中都会被sprintf格式的字符串调用,例如在F#中,如何使用paramary函数(如sprintf)?,f#,printf,currying,paramarray,F#,Printf,Currying,Paramarray,在F#中,如何处理接受可变数量参数的函数 我有这样的代码…(log函数只是一个示例,确切的实现并不重要) 它在整个代码中都会被sprintf格式的字符串调用,例如 log (sprintf "Test %s took %d seconds" "foo" 2.345) 我想在日志函数中插入sprintf功能,这样看起来像 logger "Test %s took %d seconds" "foo" 2.345 我试过类似的方法 let logger fmt ([<ParamArray&g
log (sprintf "Test %s took %d seconds" "foo" 2.345)
我想在日志函数中插入sprintf功能,这样看起来像
logger "Test %s took %d seconds" "foo" 2.345
我试过类似的方法
let logger fmt ([<ParamArray>] args) =
log (sprintf fmt args)
let logger fmt([]args)=
日志(sprintf fmt参数)
但是我不知道如何将ParamArray参数传递给sprintf调用
这在F#中是如何实现的?类似于函数的函数在F#中的行为在某种程度上是特殊的。它们采用一个格式字符串,该字符串指定所需的参数。您可以使用desco所示的
Printf.kprintf
来定义自己的函数,该函数接受格式字符串,但不能更改格式字符串的处理方式
如果要执行类似C#params
(其中参数的数量是可变的,但不取决于格式字符串),则可以直接对成员使用ParamArray
属性:
open System
type Foo =
static member Bar([<ParamArray>] arr:obj[]) =
arr |> Seq.mapi (fun i v -> printfn "[%d]: %A" i v)
这对于字符串格式来说不太优雅,但在其他情况下可能有用。不幸的是,它只适用于成员(而不适用于用
let
定义的函数)FYI-您要问的是(哪些是类型化的),而不是参数数组(哪些是非类型化的)。谢谢,这大概就是我要找的
let log (s : string) = ()
let logger fmt = Printf.kprintf log fmt
logger "%d %s" 10 "123"
logger "%d %s %b" 10 "123" true
open System
type Foo =
static member Bar([<ParamArray>] arr:obj[]) =
arr |> Seq.mapi (fun i v -> printfn "[%d]: %A" i v)
Foo.Bar("hello", 1, 3.14)