2012-04-30 24 views
6

Có thể thêm các giá trị trường không đổi vào các công đoàn phân biệt đối xử F # không?Thêm trường liên tục vào các công đoàn phân biệt đối xử F #

Tôi có thể làm điều gì đó như thế này không?

type Suit 
    | Clubs("C") 
    | Diamonds("D") 
    | Hearts("H") 
    | Spades("S") 
    with 
    override this.ToString() = 
     // print out the letter associated with the specific item 
    end 

Nếu tôi được viết một enum Java, tôi sẽ thêm một giá trị riêng để các nhà xây dựng như sau:

public enum Suit { 
    CLUBS("C"), 
    DIAMONDS("D"), 
    HEARTS("H"), 
    SPADES("S"); 

    private final String symbol; 

    Suit(final String symbol) { 
    this.symbol = symbol; 
    } 

    @Override 
    public String toString() { 
    return symbol; 
    } 
} 

Trả lời

9

Chỉ cần cho đầy đủ đây là những gì có nghĩa là:

type Suit = 
    | Clubs 
    | Diamonds 
    | Hearts 
    | Spades 
    with 
    override this.ToString() = 
     match this with 
     | Clubs -> "C" 
     | Diamonds -> "D" 
     | Hearts -> "H" 
     | Spades -> "S" 
+0

Đó chính xác là những gì tôi đã làm. – Ralph

0

Đẹp, chắc chắn bạn không thể, nhưng là tầm thường để viết một hàm mẫu trận đấu và sau đó soạn hai điều

4

điều gần gũi nhất với yêu cầu của bạn là F# enums:

type Suit = 
    | Diamonds = 'D' 
    | Clubs = 'C' 
    | Hearts = 'H' 
    | Spades = 'S' 

let a = Suit.Spades.ToString("g");; 
// val a : string = "Spades" 

let b = Suit.Spades.ToString("d");; 
// val b : string = "S" 

Vấn đề với F # enums là kết hợp mẫu không đầy đủ. Bạn phải sử dụng ký tự đại diện (_) làm mẫu cuối cùng khi thao tác enums. Do đó, mọi người có khuynh hướng thích các công đoàn bị phân biệt đối xử và viết hàm ToString rõ ràng.

Một giải pháp khác là tạo bản đồ giữa các hàm tạo và các giá trị chuỗi tương ứng. Đây là hữu ích trong trường hợp chúng ta cần phải bổ sung thêm cấu trúc:

type SuitFactory() = 
    static member Names = dict [ Clubs, "C"; 
           Diamonds, "D"; 
           Hearts, "H"; 
           Spades, "S" ] 
and Suit = 
    | Clubs 
    | Diamonds 
    | Hearts 
    | Spades 
    with override x.ToString() = SuitFactory.Names.[x] 
+0

Ví dụ đầu tiên như thế nào không đi qua FSI. – BLUEPIXY

+1

| Kim cương = 'D' -> | value1 = integer-literal1 'D' bad literall cho lỗi F # 2.0, lỗi F # 2.0? – BLUEPIXY

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