Я получаю "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 -> ...
Я получаю "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 -> ...
Охранники - это when
части. Компилятор говорит вам, что он не может сказать, является ли ваше совпадение исчерпывающим (охватывает все возможные случаи), но это может быть и не так. Компилятор не может сказать наверняка, потому что полнота неразрешима для произвольных выражений. Компилятор просто считает, что у вас должен быть по крайней мере один шаблон без защиты, потому что, когда совпадение исчерпывающее, защита в последнем случае будет избыточной.
Поскольку вы знаете, что ваше совпадение является исчерпывающим, компилятор в основном прав. Ваш второй охранник лишний. Вы можете просто оставить это без разницы в значении:
match z with
| y when List.length z = 0 -> ...
| y -> ...
Это порадует компилятора.
Мне нравится это предупреждение; за эти годы он нашел для меня несколько логических ошибок.
Если этот код не просто пример, а действительно то, что вы написали, было бы гораздо более идиоматично написать его так:
match z with
| [] -> ...
| head :: tail -> ...
Это также немного эффективнее, поскольку не нужно вычислять длину списка, а затем отбрасывать результат.
Если вам не нужно деструктурировать список, вы можете сделать его еще проще:
if z = [] then
...
else
...