2010-01-04 6 views
5

Gibt es eine Möglichkeit, Anrufe an aktive Muster zu verschachteln?Gibt es eine Möglichkeit, Anrufe an aktive F # -Muster zu verschachteln?

Etwas wie folgt aus:

type Fnord = 
| Foo of int 

let (|IsThree|IsNotThree|) x = 
    match x with 
    | x when x = 3 -> IsThree 
    | _ -> IsNotThree 

let q n = 
    match n with 
    | Foo x -> 
    match x with 
    | IsThree -> true 
    | IsNotThree -> false 
    // Is there a more ideomatic way to write the previous 
    // 5 lines? Something like: 
// match n with 
// | IsThree(Foo x) -> true 
// | IsNotThree(Foo x) -> false 

let r = q (Foo 3) // want this to be false 
let s = q (Foo 4) // want this to be true 

Oder das Spiel von einem anderen Spiel der bevorzugte Weg zu gehen, folgt?

+3

+1 für den Fnord. – bmargulies

+0

Die verdammte Sprache ist nicht lesbar. Ernsthaft - was kann es tun, dass Python nicht kann? –

+8

@lpthnc: Mustervergleich? – Chuck

Antwort

12

Es funktioniert. Sie haben nur die Muster rückwärts.

type Fnord = 
| Foo of int 

let (|IsThree|IsNotThree|) x = 
    match x with 
    | x when x = 3 -> IsThree 
    | _ -> IsNotThree 

let q n = 
    match n with 
    | Foo (IsThree x) -> true 
    | Foo (IsNotThree x) -> false 

let r = q (Foo 3) // want this to be true 
let s = q (Foo 4) // want this to be false 
+0

Ich bin ein bisschen überrascht das funktioniert, eigentlich. –

+0

@AlexeyRomanov Nun, die Fähigkeit, Muster in ihrem Hauptvorteil gegenüber anderen Formen des Versands, z. virtuelle Methoden. –

Verwandte Themen