考虑以下无意义的 lambda:
function
| [] -> "Empty list"
| hd::tl -> "Not so empty list"
这工作正常。现在我重写如下:
function
| [] -> "Empty list"
| hd::tl & l -> "Not so empty list"
再一次,出于胡说八道的原因(我知道我可以通过使用as
而不是来达到相同的效果&
,但这一切都与与这个问题无关的代码高尔夫问题有关)。现在 F# 编译器告诉我:
警告 FS0025:此表达式的模式匹配不完整。例如,值“[]”可能表示模式未涵盖的情况。
这没有任何意义——我正在明确处理[]
第一条规则中的情况。我看不到从第一个函数到第二个函数的变化[]
;两个函数的第二个规则都不会匹配它,但只有第二个函数给出警告。我所做的只是添加一个匹配任何东西的附加模式。
当然,使用空列表调用第二个函数确实会成功。
是否有发生此警告的正当理由,或者 F# 模式验证只是有一些怪癖?当使用更高级的模式时,我可以看到一些这样的情况,但这似乎是一个非常基本的模式。即使问题不能普遍解决,这种情况似乎很常见,值得在编译器中进行特殊处理。