2015-04-14 18 views
6

In F # können Sie eine Mustererkennung für eine Funktionssignatur durchführen. Ich möchte eine Reihe von Funktionen mit einer Funktion dekorieren, die die Ausführung der Funktion misst und nach statsd aufruft. Die aktuelle Funktion, die ich habe, ist:Mustererkennung basierend auf der Funktionssignatur

let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) = 
    let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName) 
    using (metrics.StartTimer(metricsIdentifier)) (fun metrics -> functionToWrap) 

Wie man oben sehen kann, wird das Präfix variieren, und in unserer Anwendung dieser pro Funktionsdefinition variieren. Anstatt also in dem Maß Präfix etwas zu tun, wie die folgende jedes Mal, ich möchte passieren zu müssen:

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" 

Gibt es eine Möglichkeit der Muster auf der Funktionssignatur in F # Matching basiert?

Jede Hilfe wird geschätzt.

Billy

Antwort

7

Wäre es möglich, die Fälle als DU zu deklarieren?

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

Prost, ging diese Route und arbeitete. Etwas eleganter! – bstack

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" 

wird für Mustererkennung arbeiten. Sie müssen normalerweise box unbekannte Typen haben, bevor Sie versuchen, sie zu werfen, als:? mag nicht auf Werttypen verwendet werden.

Ich bin mir nicht ganz sicher, wie Ihre using-Anweisung mit der Funktion, die Sie zurückgeben, interagieren wird. Ich denke, es wird Metriken entsorgen und die Funktion sofort zurückgeben, was wahrscheinlich nicht das ist, was Sie wollen.

+3

Beachten Sie auch, dass Sie auf Ihrem '' afunc''-Parameter keine Typensicherheit erhalten. Wenn jemand etwas übergeben möchte, das keine Funktion ist, wird der Compiler sie nicht stoppen. – mavnn