与元组规则匹配的F#模式永远不会匹配

时间:2017-01-25 19:15:08

标签: f# pattern-matching

首先,我是f#的新手,所以答案很明显,但我没有看到。所以我有一些带有id和值的元组。我知道我正在寻找的id,我想从我传入的三个中选择正确的元组。我打算用两个匹配语句来完成这个,一个嵌套在另一个中,但是每个事情与第一条规则相匹配。在这个例子中,我把它切成两个元组,因为这显示了我的问题。编译器给出一个永远不会匹配的"规则"警告,但我不明白为什么。

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with
    | (tupleId, _) -> tuple1
    | _ -> tuple2

任何有关更好方法的帮助或建议都将非常感激。

1 个答案:

答案 0 :(得分:6)

使用when子句:

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with
    | (x, _) when x = tupleId -> tuple1
    | _ -> tuple2

这里发生的事情是,当您使用tupleId作为匹配大小写的一部分时,您会引入一个名为tupleId的新值,您可以在匹配大小写的右侧引用该值。这会影响您的函数参数。

因为你实际上只给元组的第一个元素命名,所以任何元组都会匹配第一个元素,这就是你在第二个案例中得到'规则将不匹配'的警告。