Ваш вопрос немного запутанным, потому что вы говорите о Option
в качестве Option
, но затем показать тип который является вашим собственным Option2
типа, содержащего Option
.
Я собираюсь предположить, что ваш вопрос действительно так: Some (Some x)
сворачивает до Some x
?
Ответ на этот вопрос нет. Это разрушение будет неявно изменять тип, и вы потеряете часть безопасности типа, которую предоставляет Option
. И различие между свернутыми и не свернутыми версиями может быть важным. Возьмите этот пример.
match List.tryHead [Some 1; None; Some 2] with
| Some (Some x) -> sprintf "The first item exists with a value of %i" x
| Some None -> "The first item exists but it has no value"
| None -> "The list was empty"
List.tryHead
функция возвращает первый элемент списка, или None, если список пуст. Мы передаем ему список Option<int>
, поэтому он возвращает Option<Option<int>>
Мы можем сопоставлять возвращаемые значения, чтобы охватить все возможные случаи этого типа возврата. Это может быть полезно, если вы хотите обрабатывать эти случаи по-разному.
Но у нас еще есть возможность лечить Some None
и None
как равнозначные:
match List.tryHead [Some 1; None; Some 2] with
| Some (Some x) -> sprintf "The first item exists with a value of %i" x
| _ -> "No value found"
Нет, это не так. Это было бы очень странное поведение. Кроме того, ваше второе определение не будет компилироваться, потому что в первом случае отсутствует имя. –
Что произойдет, если вы попробуете? –
FWIW, вы можете легко «сгладить» нормальные значения 'option' с помощью * bind *:' Some (Some 42) |> Option.bind id' становится 'Some 42'. –