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

Другие вопросы по тегам