2011-09-03 34 views
12

Para una una función en línea podría crear una restricción como miembro de:patrones de restricción activa y

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

lo que el operario dada o miembro en los argumentos. ¿Hay alguna manera de hacer coincidir algo similar?

Quiero crear un patrón activo donde cualquier argumento que se pase al método que coincida con la restricción de una función en línea como la anterior desencadena esa función y todo lo demás termina como parte de la gestión de errores.

Respuesta

28

Parece que también puede escribir patrones activos en línea. No he usado esto antes, pero lo intenté ahora y parece funcionar bien. El patrón Test a continuación se puede utilizar con cualquier objeto que implemente Test método que devuelve option<^R>:

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

Ahora se puede definir una serie de objetos que definen Test método y emparejarlos con el patrón:

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

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

Este parece una técnica muy interesante, porque la coincidencia de patrones ahora es parte del objeto.

0

Creo que tendrías que usar el reflejo, p. Tener una función que tome o:obj y luego refleje a más de o.GetType() miembros.