Сопоставление с образцом в привязке let в F#

#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 для встроенного материала немного более подробно