不完整的模式匹配此表达式

时间:2015-12-07 19:49:08

标签: f#

我收到以下代码的警告:

    | _ -> 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

我注意到在我的编辑器闲置几分钟后,当我再次构建我的解决方案时,警告消失了。

我做错了吗?

1 个答案:

答案 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完全相同。