我收到以下代码的警告:
| _ -> let card1::card2::remainingDeck = newDeck
Some(card1, card2), remainingDeck
此表达式上的不完整模式匹配。例如,值 ' [_]'可能表示该模式未涵盖的案例。
以下是代码的其余部分:
let newDeck = [for suit in suits do
for face in faces do
yield {Face=face; Suit=suit}]
let deal = function
| card1::card2::remaining -> Some(card1, card2), remaining
| _ -> let card1::card2::remainingDeck = newDeck
Some(card1, card2), remainingDeck
我注意到在我的编辑器闲置几分钟后,当我再次构建我的解决方案时,警告消失了。
我做错了吗?
答案 0 :(得分:6)
您收到警告,因为编译器有关newDeck
的唯一信息是其类型。它没有关于列表长度的信息 - 如果newDeck
没有至少2个元素,let card1::card2::remainingDeck = newDeck
会抛出MatchFailureException
。
实际上
let card1::card2::remainingDeck = newDeck
Some(card1, card2), remainingDeck
相当于
match newDeck with
| card1::card2::remainingDeck -> Some(card1, card2), remainingDeck
编译的MSIL完全相同。