Сжатое сопоставление с образцом на единственном распознаваемом объединении в F#
Скажем, у меня есть следующий единый случай дискриминированного союза:
type OrderId = OrderId of string
В какой-то момент мне нужна актуальная строка. Я нашел способ извлечь это:
let id = match orderId with OrderId x -> x
Есть ли более краткий способ сделать это?
Я понимаю, что мое использование является особым случаем, и соответствие имеет смысл, чтобы убедиться, что вы раскрыли все возможности, просто задаваясь вопросом, есть ли способ сделать что-то вроде:
let OrderId id = orderId
2 ответа
Ты почти там. Скобки необходимы для того, чтобы компилятор интерпретировал let-границы как сопоставление с образцом:
let (OrderId id) = orderId
Если orderId
это параметр функции, вы также можете использовать сопоставление с шаблоном непосредственно там:
let extractId (OrderId id) = id
Когда вы используете различаемое объединение для хранения одного значения (что является полезным методом программирования на F#), тогда может иметь смысл определить его со свойством для доступа к значению:
type OrderId =
| OrderId of string
member x.Value = let (OrderId v) = x in v
Реализация Value
использует сопоставление с шаблоном, используя let
как отправлено pad. Теперь, если у вас есть значение orderId
типа OrderId
Вы можете просто написать:
let id = orderId.Value
Тем не менее, сопоставление с образцом с использованием (OrderId id)
все еще весьма полезно, потому что доступ к свойству будет работать только тогда, когда компилятор уже знает тип orderId
(поэтому вы обычно используете сопоставление с образцом в аргументе функции, но доступ к свойству для других значений).