OCaml жалуется на
let x::l = List.rev ds in "woot"
, который завершится неудачей, если List.rev ds
выдаст []
.
Конечно, мы знаем, что это невозможно, потому что, если List.rev ds
будет пустым, тогда ds
должен быть пустым, что невозможно из-за другого охранника; но Окамл этого не знает.
См. документы :
Сопоставление с образцом в OCaml может проверить, является ли набор шаблонов исчерпывающим или нет, основываясь только на типе .
и далее приводит пример, который удивительно похож на ваш.
Относительно того, что вы "легко выводите исчерпывающий характер вышеприведенного кода" ... Я не думаю, что это так просто, как вы делаете это звучащим. Представьте, что вместо ds
вы потребовали, чтобы он не был пустым, чтобы он был "foo", а внутренняя охрана убедилась, что Digest.to_hex(Digest.string ds)
равно "acbd18db4cc2f85cedef654fccc4a4d8"
(что должно быть так, как это MD5 дайджест "foo"
). Уже не так просто, даже для нас, людей. Но есть ли разница между List.rev ds
и Digest.to_hex(Digest.string ds)
, с точки зрения компьютера? Типы просты. Значения жесткие .