基于函数签名的模式匹配

Pattern matching based on the function signature

在 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#中有没有基于函数签名的模式匹配方式?

感谢任何帮助。

比利

let WrapFunction metrics afunc = 
    match box afunc with
    | :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1")
    | :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2")
    | _ -> failwith "Unknown function def"

将适用于您的模式匹配。在尝试转换它们之前,您通常最终不得不 box 未知类型,如 :?不喜欢在值类型上使用。

虽然我不完全确定您的 using 语句将如何与您 return 的函数交互。我认为它会立即处理指标和 return 函数,这可能不是您想要的。

是否可以将案例声明为 DU?

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