F# 基于函数签名的模式匹配

F# 基于函数签名的模式匹配,f#,functional-programming,statsd,F#,Functional Programming,Statsd,在F#中,你能在函数签名上进行模式匹配吗。我想用一个函数来修饰一些函数,该函数度量函数的执行并调用statsd。我目前的职能是: let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) = let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName) using (metrics.Sta

在F#中,你能在函数签名上进行模式匹配吗。我想用一个函数来修饰一些函数,该函数度量函数的执行并调用statsd。我目前的职能是:

let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) =
    let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName)
    using (metrics.StartTimer(metricsIdentifier)) ( fun metrics -> functionToWrap)
正如您在上面所看到的,前缀将有所不同,在我们的应用程序中,这将根据函数定义而有所不同。因此,我不必每次都要传入度量前缀,而是要执行以下操作:

let WrapFunction metrics afunc = 
    match afunc with
    | :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1")
    | :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2")
    | _ -> failwith "Unknown function def"
有没有基于F#中函数签名的模式匹配方法

谢谢你的帮助

比利

对你的模式匹配有用。通常,在尝试强制转换未知类型之前,您必须
box
未知类型,例如:?不喜欢在值类型上使用


我不完全确定using语句将如何与返回的函数交互。我认为它将处理度量并立即返回函数,这可能不是您想要的。

是否可以将案例声明为DU

type MyFunctions =
| Intish of int -> int
| Stringish of string -> string

还要注意的是,在
afunc
参数上根本没有类型安全性。如果有人想传递一些不是函数的东西,编译器不会阻止他们。干杯,沿着这条路线走下去并成功了。稍微优雅一点!
type MyFunctions =
| Intish of int -> int
| Stringish of string -> string