基于函数签名的模式匹配

时间:2015-04-14 12:57:33

标签: f# functional-programming statsd

在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#中的函数签名是否有任何模式匹配方式?

任何帮助表示感谢。

比利

2 个答案:

答案 0 :(得分:7)

是否有可能将案件宣布为DU?

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

答案 1 :(得分:3)

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语句将如何与你返回的函数进行交互。我认为它会处理指标并立即返回功能,这可能不是你想要的。