活动模式的联合案例是否始终需要通配符?

时间:2016-04-07 14:24:51

标签: f#

Active Patterns的联合案例是否总是需要通配符?

警告:

  

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

let (|Positive|Neutral|Negative|) = function
    | x when x > 0 -> Positive
    | x when x = 0 -> Neutral
    | x when x < 0 -> Negative

当我将外卡作为联合案例插入时,警告已解决:

let (|Positive|Neutral|Negative|) = function
    | x when x > 0 -> Positive
    | x when x = 0 -> Neutral
    | x when x < 0 -> Negative
    | _            -> failwith "unknown"

我遗失了哪些其他案例?

1 个答案:

答案 0 :(得分:4)

编译器无法检查(一般)

when防护。在这种特殊情况下,只要省略最后一个警卫,因为你没有错过一个案例:

let (|Positive|Neutral|Negative|) = function
    | x when x > 0 -> Positive
    | x when x < 0 -> Negative
    | _ -> Neutral

注意:对于int,这没关系,float需要更多案例(NaN和无穷大),编译器将无法帮助您(正如您刚刚发现的那样) )。