2011-09-03 14 views
12

Przez jedną funkcję rolki może utworzyć wiązanie, takie jak:Całość wzory i element ograniczające

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

wymaga danego operatora lub członu na argumenty. Czy istnieje sposób na dopasowanie w oparciu o coś podobnego?

Chcę utworzyć aktywny wzór, w którym dowolny argument przekazany do metody, która pasuje do ograniczenia funkcji podkreślonej, powoduje, że ta funkcja i wszystko inne kończy się jako część zarządzania błędami.

Odpowiedz

28

Wygląda na to, że można również pisać aktywne wzory liniowe. Nie używałem tego wcześniej, ale spróbowałem tego teraz i wygląda na to, że działa dobrze. Test wzór poniżej może być używany z dowolnym obiektem, który implementuje Test metodę, która zwraca option<^R>:

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

Teraz można zdefiniować kilka obiektów, które definiują Test metody i dopasować je za pomocą wzoru:

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

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

ten wygląda na bardzo interesującą technikę, ponieważ dopasowanie do wzorca jest teraz częścią obiektu.

0

Myślę, że musiałbyś użyć refleksji, np. Mieć funkcję, która zajmuje o:obj, a następnie odzwierciedlać nad członkami o.GetType().