【问题标题】:Pattern matching based on the function signature基于函数签名的模式匹配
【发布时间】:2015-04-14 12:57:32
【问题描述】:

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

任何帮助表示赞赏。

比利

【问题讨论】:

    标签: f# functional-programming statsd


    【解决方案1】:

    是否可以将案件申报为 DU?

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

    【讨论】:

    • 干杯,沿着这条路线走下去并且工作了。稍微优雅一点!
    【解决方案2】:
    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 语句将如何与您返回的函数交互。我认为它会立即处理指标并返回函数,这可能不是您想要的。

    【讨论】:

    • 另请注意,您的 afunc 参数根本没有类型安全性。如果有人想传入不是函数的东西,编译器不会阻止他们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2022-07-12
    • 2013-08-19
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多