f# - Patrones activos y restricción de miembro
constraints inline (2)
Creo que tendrías que usar la reflexión, por ejemplo, tener una función que tome o:obj
y luego reflejar sobre los o.GetType()
.
Para una función en línea, se podría crear una restricción como:
let inline implicit arg =
( ^a : (static member op_Implicit : ^b -> ^a) arg)
requiriendo al operador o miembro dado sobre 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 el anterior activa esa función y todo lo demás termina como parte de la gestión de errores.
Parece que también puedes escribir patrones activos en línea. No he usado esto antes, pero lo intenté ahora y parece funcionar bien. El siguiente patrón de Test
se puede usar con cualquier objeto que implemente Test
método de Test
que devuelve la option< ^R >
:
let inline (|Test|_|) (a:^T) : option< ^R > =
(^T : (member Test : unit -> option< ^R >) a)
Ahora puede definir algunos objetos que definen Test
método Test
y hacerlos coincidir con el patrón:
type A() =
member x.Test() = Some(10)
match new A() with
| Test(n) -> printfn "%d" n
| _ -> printfn "failed"
Esto parece una técnica muy interesante, porque la coincidencia de patrones ahora es parte del objeto.