Ответ 1
Традиционный способ получения значения внутри любого конструктора в OCaml - это сопоставление с образцом. Согласование шаблонов является частью OCaml, которая может отличаться от того, что вы уже видели на других языках, поэтому я бы рекомендовал вам не просто писать программы так, как вы привыкли (например, обойти проблему с ocaml-lib), но попробуйте и посмотрите, нравится ли вам это.
let contents =
match z with
Some c -> c;;
Переменная contents
назначается 3
, но вы получаете предупреждение:
Предупреждение 8: это сопоставление шаблонов не является исчерпывающим. Вот пример значения, которое не соответствует: None
В общем случае вы не будете знать, что выражение, которое вы хотите просмотреть внутри, обязательно является Some c
. Причина выбора типа опции обычно такова, что иногда это значение может быть None
. Здесь компилятор напоминает вам, что вы не обрабатываете один из возможных случаев.
Вы можете совпадать с шаблоном "по глубине", и компилятор по-прежнему будет проверять полноту. Рассмотрим эту функцию, которая принимает (int option) option
:
let f x =
match x with
Some (Some c) -> c
| None -> 0
;;
Здесь вы забыли случай Some (None)
, и компилятор говорит вам об этом:
Предупреждение 8: это сопоставление шаблонов не является исчерпывающим. Вот пример значения, которое не соответствует: Some None