2011-09-03 12 views
12

Per una funzione inline si potrebbe creare un vincolo come:modelli Attivi organo di vincolo

let inline implicit arg = 
    (^a : (static member op_Implicit : ^b -> ^a) arg) 

richiedendo all'operatore dato o membro sugli argomenti. C'è un modo per abbinare basato su qualcosa di simile?

Voglio creare un modello attivo in cui qualsiasi argomento passato al metodo che corrisponde al vincolo di una funzione inline come sopra attiva la funzione e tutto il resto termina come parte di una gestione degli errori.

risposta

28

Sembra che sia possibile scrivere anche modelli attivi in ​​linea. Non l'ho mai usato prima, ma l'ho provato ora e sembra funzionare bene. Il modello Test seguito può essere utilizzato con qualsiasi oggetto che implementa Test metodo che restituisce option<^R>:

let inline (|Test|_|) (a:^T) : option<^R> = 
    (^T : (member Test : unit -> option<^R>) a) 

Ora è possibile definire alcuni oggetti che definiscono Test metodo e corrispondere loro utilizzando il modello:

type A() = 
    member x.Test() = Some(10) 

match new A() with 
| Test(n) -> printfn "%d" n 
| _ -> printfn "failed" 

Questo sembra una tecnica molto interessante, perché la corrispondenza dei pattern è ora una parte dell'oggetto.

0

Penso che dovresti usare la riflessione, ad es. Avere una funzione che richiede o:obj e quindi riflettere sui membri di o.GetType().