基于函数签名的模式匹配
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
在 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