2012-04-30 11 views
6

Czy można dodać stałe wartości pól do F # dyskryminowanych związków?Dodawanie stałych pól do F # dyskryminowanych związków

Czy mogę zrobić coś takiego?

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

Gdybym pisanie enum Java, chciałbym dodać prywatną wartości do konstruktora tak:

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

Odpowiedz

9

Tylko dla kompletności to, co rozumie się:

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

Dokładnie to zrobiłem. – Ralph

0

pewien, że nie można, ale jest trywialny napisać funkcję, która wzór mecze, a następnie skomponować dwie rzeczy

4

najbliższa rzecz do swojej wymogiem jest 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" 

Problem z wyliczeniami F # jest niewyczerpującym dopasowywaniem wzorca. Musisz użyć symbolu wieloznacznego (_) jako ostatniego wzorca podczas manipulowania wyliczeniami. Dlatego ludzie preferują dyskryminowane związki i piszą jawną funkcję ToString.

Innym rozwiązaniem jest wykonanie mapowania między konstruktorami i odpowiednimi wartościami ciągu. Jest to przydatne w przypadku musimy dodać więcej konstruktorów:

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

Pierwszym przykładem tego, jak nie przechodzą przez FSI. – BLUEPIXY

+1

| Diamenty = "D" -> | value1 = integer-literal1 "D" zły literał dla błędu F # 2.0, F # 2.0? – BLUEPIXY

Powiązane problemy