Совпадение совпадений в однодисковом дискриминированном объединении в 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
(так что вы обычно используете сопоставление шаблонов в аргументе функции, но доступ к свойствам для другие значения).