Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在F#中,如何使用paramary函数(如sprintf)?_F#_Printf_Currying_Paramarray - Fatal编程技术网

在F#中,如何使用paramary函数(如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

在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>] 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)