2010-01-04 34 views
5

Có cách nào để lồng các cuộc gọi đến các mẫu đang hoạt động không?Có cách nào để lồng các cuộc gọi đến F # mẫu đang hoạt động không?

Something như thế này:

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 

Hoặc là trận đấu tiếp theo trận đấu khác cách ưa thích để đi đâu?

+3

+1 cho Fnord. – bmargulies

+0

Ngôn ngữ chết tiệt không thể đọc được. Nghiêm túc - những gì nó có thể làm điều đó Python có thể không? –

+8

@lpthnc: So khớp mẫu? – Chuck

Trả lời

12

Nó hoạt động. Bạn chỉ có các mẫu ngược lại.

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

Tôi hơi ngạc nhiên về công việc này. –

+0

@AlexeyRomanov Vâng, khả năng làm tổ các mẫu trong lợi ích chính của chúng so với các hình thức công văn khác, ví dụ: phương pháp ảo. –

Các vấn đề liên quan