2015-04-14 15 views
6

In F # è possibile eseguire il confronto con una firma di funzione. Voglio decorare una serie di funzioni con una funzione che misura l'esecuzione della funzione e chiama a statsd. La funzione attuale che ho è:Corrispondenza del modello in base alla firma della funzione

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

Come potete vedere sopra, il prefisso varierà, e nella nostra applicazione questo può variare per ogni definizione di funzione. Quindi, piuttosto che dover passare nel prefisso misura ogni volta che voglio fare qualcosa di simile al seguente:

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" 

C'è un modo di pattern matching sulla base della firma della funzione in F #?

Qualsiasi aiuto apprezzato.

Billy

risposta

7

Sarebbe possibile dichiarare i casi come DU?

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

Cheers, è andato giù per questa strada e ha funzionato. Leggermente più elegante! – 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" 

lavorerà per il vostro pattern match. Di norma, devi finire con i tipi sconosciuti box prima di provare a lanciarli, come:? non piace essere usato sui tipi di valore.

Non sono del tutto sicuro di come la vostra istruzione using interagirà con la funzione restituita. Penso che eliminerà le metriche e restituirà immediatamente la funzione, che probabilmente non è ciò che desideri.

+3

Si noti inoltre che non si ottiene alcun tipo di sicurezza sul parametro '' afunc''. Se qualcuno vuole passare qualcosa che non è una funzione, il compilatore non li fermerà. – mavnn

Problemi correlati