Ocaml: Плохой стиль, все предложения в этом сопоставлении с образцом защищены.

Я получаю "Error: Warning 25: bad style, all clauses in this pattern-matching are guarded"

Что значит "под охраной"?

Мой код имеет сопоставление с образцом-

match z with
    | y when List.length z = 0 -> ...
    | y when List.length z > 0 -> ...

person Aspen    schedule 15.12.2011    source источник


Ответы (1)


Охранники - это when части. Компилятор говорит вам, что он не может сказать, является ли ваше совпадение исчерпывающим (охватывает все возможные случаи), но это может быть и не так. Компилятор не может сказать наверняка, потому что полнота неразрешима для произвольных выражений. Компилятор просто считает, что у вас должен быть по крайней мере один шаблон без защиты, потому что, когда совпадение исчерпывающее, защита в последнем случае будет избыточной.

Поскольку вы знаете, что ваше совпадение является исчерпывающим, компилятор в основном прав. Ваш второй охранник лишний. Вы можете просто оставить это без разницы в значении:

match z with
| y when List.length z = 0 -> ...
| y -> ...

Это порадует компилятора.

Мне нравится это предупреждение; за эти годы он нашел для меня несколько логических ошибок.

Если этот код не просто пример, а действительно то, что вы написали, было бы гораздо более идиоматично написать его так:

match z with
| [] -> ...
| head :: tail -> ...

Это также немного эффективнее, поскольку не нужно вычислять длину списка, а затем отбрасывать результат.

Если вам не нужно деструктурировать список, вы можете сделать его еще проще:

if z = [] then
    ...
else
    ...
person Jeffrey Scofield    schedule 15.12.2011
comment
Спасибо Джеффри. Вы действительно прояснили ситуацию и помогли мне научиться писать более чистый код (особенно с операторами if). :) - person Aspen; 15.12.2011