#f# #pattern-matching
#f# #сопоставление с образцом
Вопрос:
Я хочу сделать:
let Some(x) = bar in ...
но я не могу этого сделать, если не сделаю
let Some(x) as idontcare = bar in ...
есть ли лучший способ сказать: «Меня не волнует весь шаблон, просто сопоставьте его внутри»
(Я бы использовал _
, но это не анализируется, поэтому я использую __
вместо этого)
Да, я знаю, что это частично, я просто делаю быстрый скрипт.
Редактировать: Также это всего лишь пример со встроенным типом sum, поэтому Option.get
он не является общим; плюс я хочу, чтобы это было встроенным, как привязки Haskell.
Ответ №1:
let Some(x) = bar
определяет новую функцию Some
, затеняющую существующий конструктор. Вместо этого вы хотите:
let (Some(x)) = bar
Комментарии:
1. Прохладный. Довольно странно, что вы вообще можете затенять конструкторы в привязках let, учитывая, что эквивалент в
match
limbs является кошерным2. Предупреждение может быть подавлено
#nowarn "25"
, но как вы обходитеMatchFailureException
? ( Случаи совпадения были неполными )3. Я этого не делаю; если операция завершается неудачно, возникают более серьезные проблемы, и я просто прерываю программу и выполняю очистку после нее.
4.
let (Some x) = bar
— чтобы избежать дополнительной пары скобок.
Ответ №2:
Вы могли бы использовать match
:
match bar with | Some(x) -> ...
если вы пытаетесь сопоставить конкретный параметр, вы могли бы использовать Option.get
:
bar |> Option.get |> ...
Комментарии:
1. Это работает, но только для Option, а
match
для встроенного материала немного более подробно