2009-04-08 6 views
7

Gibt es eine Möglichkeit auf diskriminierten Union Funktionen Mustervergleich, zB: -Muster auf einer diskriminierte Vereinigung passenden

type Test = 
    | A of string 
    | B of int 
    | C of char 

let DefaultTest t = 
    match t with 
    | A(_) -> A(null) 
    | B(_) -> B(0) 
    | C(_) -> C('\u0000') 

let a = A |> DefaultTest 

Offensichtlich ist dieser Code nicht gültig F # als DefaultTest einen Parameter vom Typ-Test akzeptiert und nicht als " a -> Test. Gibt es eine Möglichkeit, dies zu erreichen ohne Angabe eines Wertes für die diskriminierte Union?

Was ich letztlich bin, ist eine Funktion, die eine Funktion des Typs 'a -> Test eingibt und Test (Standardwert von' a) ausgibt.

Antwort

5

Ich bin nicht klar, was du bist nach, aber hilft das?

+0

Brilliant. Genau das brauche ich! Ich fühle mich jetzt sehr dumm ...! – ljs

+0

Ich fand auch A |> fun f -> Unchecked.defaultof <_> |> f ziemlich lecker zu sein !!! – ljs

+0

Möchten Sie "A Unchecked.defaultof <_>" mehr? – Brian

1

Dies könnte möglicherweise funktionieren, wenn alle Konstruktoren den gleichen Argumenttyp hatten, sagen wir Int. Dann könnte man

Spiel t 0 von
| A 0 -> ...
| B 0 -> ...

+0

Leider müssen die Argumenttypen anders sein ...! – ljs

3

Nicht sicher, was Sie nach, aber so etwas wie:

let DefaultTest (t :obj) = 
    match t with 
    | :? (string->Test) as a -> Some (a null) 
    | :? (int -> Test) as b -> Some (b 0) 
    | :? (char -> Test) as c -> Some (c '\u0000') 
    | _ -> Option.None 

könnte für Sie arbeiten ...

+0

Wirklich ausgezeichnete Antwort, aber Brians Antwort passiert, mein konkretes Problem generischer zu lösen! – ljs

Verwandte Themen