Совпадение совпадений в однодисковом дискриминированном объединении в F #

Скажем, что у меня есть следующий единственный случай, когда дискредитированный союз:

type OrderId = OrderId of string

В какой-то момент мне нужна фактическая строка. Как я нашел для его извлечения:

let id = match orderId with OrderId x -> x

Есть ли более сжатый способ сделать это?

Я понимаю, что мое использование - особый случай, и матч имеет смысл, чтобы убедиться, что вы рассмотрели возможности, просто задаваясь вопросом, есть ли способ сделать что-то вроде:

let OrderId id = orderId

Ответы

Ответ 1

Ты почти там. Круглые скобки необходимы для того, чтобы компилятор интерпретировал привязку привязки как шаблон:

let (OrderId id) = orderId

Если orderId является параметром функции, вы также можете напрямую использовать сопоставление шаблонов:

let extractId (OrderId id) = id

Ответ 2

Когда вы используете дискриминированный союз для хранения единственного значения (который является полезным методом программирования F #), тогда имеет смысл определить его с помощью свойства для доступа к значению:

type OrderId = 
  | OrderId of string 
  member x.Value = let (OrderId v) = x in v

Реализация Value использует сопоставление шаблонов с использованием let, как это было написано пэдом. Теперь, если у вас есть значение orderId типа orderId, вы можете просто написать:

let id = orderId.Value

Однако сопоставление шаблонов с использованием (OrderId id) по-прежнему весьма полезно, поскольку доступ к свойствам будет работать только тогда, когда компилятор уже знает тип orderId (так что вы обычно используете сопоставление шаблонов в аргументе функции, но доступ к свойствам для другие значения).