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
Другие вопросы по тегам