Добавление полей констант в размеченные объединения 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;
  }
}

person Ralph    schedule 30.04.2012    source источник


Ответы (3)


Для полноты картины имеется в виду следующее:

type Suit = 
  | Clubs
  | Diamonds
  | Hearts
  | Spades
  with
    override this.ToString() =
        match this with
        | Clubs -> "C"
        | Diamonds -> "D"
        | Hearts -> "H"
        | Spades -> "S"
person yamen    schedule 30.04.2012

Наиболее близким к вашему требованию является перечисления F #:

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 # заключается в неполном сопоставлении с образцом. Вы должны использовать подстановочный знак (_) в качестве последнего шаблона при работе с перечислениями. Поэтому люди склонны предпочитать размеченные союзы и писать явную ToString функцию.

Другое решение - сделать сопоставление между конструкторами и соответствующими строковыми значениями. Это полезно, если нам нужно добавить больше конструкторов:

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]
person pad    schedule 30.04.2012
comment
Первый пример того, как не пройти через ФГУ. - person BLUEPIXY; 30.04.2012
comment
| Бриллианты = 'D' - ›| value1 = integer-literal1 'D' - плохой литерал для F # 2.0, ошибка F # 2.0? - person BLUEPIXY; 30.04.2012

Совершенно уверен, что вы не можете, но тривиально написать функцию, которая соответствует шаблону, а затем скомпоновать две вещи

person Aidan    schedule 30.04.2012