F # Неполный шаблон соответствует этому выражению при использовании "когда".. Почему?

У меня есть эта простая функция F #:

let compareNum x =
    let y = 10
    match x with
    | _ when x = y -> 0
    | _ when x > y -> 1
    | _ when x < y -> -1

Однако компилятор F # дает мне предупреждение "Неполные шаблоны совпадений в этом выражении". В этом случае все случаи должны охватывать каждый шаблон.

Я также вижу аналогичный пример в разделе "Соответствие шаблону" в 1-м выпуске книги программирования F # Криса Смита. Итак, что-то может быть изменено в более поздней версии F #?

Ответ 1

Я думаю, что ответ на предыдущий вопроскомментарии - "В общем, это это анти-шаблон, который должен иметь в качестве защиты в последнем шаблоне" kimsk).

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

let compareNum x =
  let y = 10
  match x with
  | _ when x = y -> 0
  | _ when x > y -> 1
  | _ (*when x < y*) -> -1