2012-04-30 18 views
6

¿Es posible agregar valores de campo constantes a las uniones discriminadas F #?Agregar campos constantes a uniones discriminadas F #

¿Puedo hacer algo como esto?

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

Si estuviera escribiendo una enumeración de Java, añadiría un valor privada al constructor de esta manera:

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

Respuesta

9

simplemente para la corrección esto es lo que se quiere decir:

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

Eso es exactamente lo que hice. – Ralph

0

bastante seguro de que no puede, pero es trivial para escribir una función que el patrón partidos y luego componer las dos cosas

4

lo más parecido a su requerimiento es 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" 

El problema con las enumeraciones F # es la coincidencia de patrones no exhaustiva. Debe usar comodines (_) como el último patrón al manipular enumeraciones. Por lo tanto, las personas tienden a preferir las uniones discriminadas y escribir explícitamente la función ToString.

Otra solución es hacer un mapeo entre los constructores y los valores de cadena correspondientes. Esto es útil en caso de que necesitemos añadir más constructores:

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

El primer ejemplo de cómo no pasar por el FSI. – BLUEPIXY

+1

| Diamantes = 'D' -> | value1 = integer-literal1 'D' mala literall para F # 2.0, error F # 2.0? – BLUEPIXY

Cuestiones relacionadas