2012-04-30 48 views
6

是否可以將常數字段值添加到F#歧義工會?將常量字段添加到F#歧義工會

我可以這樣做嗎?

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

如果我正在寫一個Java枚舉,我會私人值添加到構造像這樣:

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; 
    } 
} 

回答

9

只是爲了完整性,這是什麼意思:

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

這正是我所做的。 – Ralph

0

很肯定你不能,而是微不足道的編寫一個函數,模式比賽然後撰寫的兩件事情

4

的最接近你的要求是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" 

F#枚舉的問題是非窮舉模式匹配。操作枚舉時,必須使用通配符(_)作爲最後一個模式。因此,人們傾向於偏好歧視性的工會,並寫出明確的職能。

另一種解決方案是在構造函數和相應的字符串值之間進行映射。這是有幫助的情況下,我們需要添加更多的構造函數:

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

如何不通過FSI中的第一個例子。 – BLUEPIXY

+1

|鑽石='D' - > | value1 =整數字面值1'D'對於F#2.0,F#2.0的錯誤literall? – BLUEPIXY