Насколько мне известно, F # не обеспечивает анализ типов на основе потока управления. Я думаю, что это противоречило бы дизайну F # как языка, ориентированного на выражения.
Однако F # предоставляет несколько механизмов для решения этой проблемы.
Первый - это вложенные match
операторы с использованием сопоставления с образцом:
let foo first second =
match first with
| Some true ->
match second with
| Some true -> true
| _ -> false
| _ -> false
Второй способ, как указывали другие, состоит в использовании одного match
, но в кортеже. Обратите внимание, что элементы в кортеже не обязательно должны иметь один и тот же тип!
let foo first second =
match first, second with
| Some true, Some true -> true
| _ -> false
Обратите внимание, что в вашем конкретном примере, вероятно, проще всего использовать Option.defaultValue
:
let foo first second =
(Option.defaultValue false first)
&& (Option.defaultValue false second)