在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#中的函数签名是否有任何模式匹配方式?
任何帮助表示感谢。
比利
答案 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语句将如何与你返回的函数进行交互。我认为它会处理指标并立即返回功能,这可能不是你想要的。