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